通用约束忽略协方差

假设我们有一个类似的界面

public interface IEnumerable { /*...*/ } 

这是T 共变体

然后我们有另一个接口和一个实现它的类:

 public interface ISomeInterface {} public class SomeClass : ISomeInterface {} 

现在,协方差允许我们执行以下操作

 IEnumerable e = Enumerable.Empty(); 

因此, IEnumerable 可分配IEnumerable类型的变量(或方法参数)。

但是如果我们在通用方法中尝试这个:

 public void GenericMethod(IEnumerable p) where T : ISomeInterface { IEnumerable e = p; // or TestMethod(p); } public void TestMethod(IEnumerable x) {} 

我们得到编译器错误CS0266告诉我们IEnumerable无法转换为IEnumerable

约束清楚地表明T是从ISomeInterface派生的,并且由于IEnumerableT是共变量,因此该赋值应该起作用(如上所示)。

是否有任何技术原因导致这种方法无法在通用方法中起作用? 或者我错过的任何东西都让编译器弄清楚它太贵了?

更改GenericMethod并添加通用约束class

 public void GenericMethod(IEnumerable p) where T : class, ISomeInterface { IEnumerable e = p; // or TestMethod(p); } 

协方差不支持结构 ,所以我们需要告诉我们只想使用类。