C# C编译器无法识别正在实现接口的类
下面的代码无法使用VS2010编译,我不知道为什么。编译器应该能够推断该列表是“兼容的”,很抱歉没有更好的IEnumerable单词,但不知怎的,它不是。我错过了什么 编译器给出两个错误: 与“ConsoleApplication1.Program.TestSystem.Collections.Generic.IEnumerable”匹配的最佳重载方法具有一些无效参数 参数1:无法从“System.Collections.Generic.List”转换为“System.Collections.Generic.IEnumerable”C# C编译器无法识别正在实现接口的类,c#,.net,generics,.net-4.0,covariance,C#,.net,Generics,.net 4.0,Covariance,下面的代码无法使用VS2010编译,我不知道为什么。编译器应该能够推断该列表是“兼容的”,很抱歉没有更好的IEnumerable单词,但不知怎的,它不是。我错过了什么 编译器给出两个错误: 与“ConsoleApplication1.Program.TestSystem.Collections.Generic.IEnumerable”匹配的最佳重载方法具有一些无效参数 参数1:无法从“System.Collections.Generic.List”转换为“System.Collections.G
这与方差、协方差和逆变换有关;请查看这篇文章和Jon Skeet的答案查看项目框架的目标版本。这段代码只能在.NET4中使用。您试图做的就是将较窄的类型TestClass转换为较宽的类型ITest。这是你将一直习惯的事情,例如,当你从浮点转换为双精度时 不幸的是.NET3.5及更低版本不支持泛型类中的协方差 Net 4.0现在确实支持泛型中的协方差和逆变,前提是这些泛型类在编译时使用关键字out表示协方差类型,in表示逆变类型。Net 4.0中的IEnumerable定义为协变。如果右键单击IEnumerable类型并单击转到定义,您将看到:
public interface IEnumerable<out T> : IEnumerable
如果您使用的是VS2010,则需要确保您的项目以.net 4.0为目标。这可以从项目属性中更改。右键单击项目,选择属性,转到应用程序选项卡,并检查目标框架是否为.NET4
public interface IEnumerable<out T> : IEnumerable