Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C编译器无法识别正在实现接口的类_C#_.net_Generics_.net 4.0_Covariance - Fatal编程技术网

C# C编译器无法识别正在实现接口的类

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

下面的代码无法使用VS2010编译,我不知道为什么。编译器应该能够推断该列表是“兼容的”,很抱歉没有更好的IEnumerable单词,但不知怎的,它不是。我错过了什么

编译器给出两个错误:

与“ConsoleApplication1.Program.TestSystem.Collections.Generic.IEnumerable”匹配的最佳重载方法具有一些无效参数

参数1:无法从“System.Collections.Generic.List”转换为“System.Collections.Generic.IEnumerable”


这与方差、协方差和逆变换有关;请查看这篇文章和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