通用约束忽略协方差
假设我们有一个类似的界面
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); }
协方差不支持结构 ,所以我们需要告诉我们只想使用类。
上述就是C#学习教程:通用约束忽略协方差分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/957735.html