通用约束忽略协方差
假设我们有一个类似的界面
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
派生的,并且由于IEnumerable
在T
是共变量,因此该赋值应该起作用(如上所示)。
是否有任何技术原因导致这种方法无法在通用方法中起作用? 或者我错过的任何东西都让编译器弄清楚它太贵了?
更改GenericMethod
并添加通用约束class
:
public void GenericMethod(IEnumerable p) where T : class, ISomeInterface { IEnumerable e = p; // or TestMethod(p); }
协方差不支持结构 ,所以我们需要告诉我们只想使用类。