我在WPF项目中有一些简单的代码行,它们给我编译错误。
var resourceNames = new List<string> { "cmbItem1", "cmbItem2", "cmbItem3", "cmbItem4" };
var comboBoxItems = resourceNames.Select(id => (string)FindResource(id)).ToList();
// other code
编译错误文本是
错误2类型 'System.Windows.Forms.Control'是在没有的程序集中定义的 引用。您必须添加对程序集的引用 'System.Windows.Forms,Version = 4.0.0.0,Culture = neutral, 公钥= b77a5c561934e089' 。
为什么我引用该程序集?我不使用System.Windows.Forms.Control中的任何类型!
如果我重写代码来进行静态方法调用而不是扩展方法调用,它可以正常工作:
var resourceNames = new List<string> { "cmbItem1", "cmbItem2", "cmbItem3", "cmbItem4" };
var comboBoxItems = Enumerable.Select(resourceNames, id => (string)FindResource(id));
comboBoxItems = Enumerable.ToList(comboBoxItems);
// other code
为什么会这样?我做错了什么?
UPD1:
UPD2:答案
我和我的同事调查了该项目,发现了问题的原因。以下是有关我们的视觉工作室解决方案的几个事实:
以下是扩展方法的代码和定义它的类:
using System.Windows.Forms;
namespace Global
{
public static class ControlExtensions
{
// If I remove the where-clause, the code problem disappears!
public static T FindParentByType<T>(this Control parentControl) where T : Control
{
var currentControl = parentControl != null ? parentControl.Parent : null;
while (currentControl != null)
{
if (currentControl is T)
return (T)currentControl;
currentControl = currentControl.Parent;
}
return null;
}
}
}