Select()和ToList()LINQ方法的编译时错误

时间:2011-12-21 11:45:21

标签: c# extension-methods compile-time

我在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: An error is in the list.

UPD2:答案

我和我的同事调查了该项目,发现了问题的原因。以下是有关我们的视觉工作室解决方案的几个事实:

  1. 有问题的代码驻留在名为Flyer2的项目中。该项目引用了另一个名为Global的项目。
  2. 项目Global有几个类,提供全局可访问的扩展方法。
  3. 其中一种扩展方法对where子句中的泛型类型有限制。限制说泛型类型必须是System.Windows.Control的后代......出于某种原因,存在这样的方法会产生我所描述的编译时错误......
  4. 以下是扩展方法的代码和定义它的类:

    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;
            }
        }
    }
    

0 个答案:

没有答案