Csharp/C#教程:通用约束忽略协方差分享


通用约束忽略协方差

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

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); } 

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

上述就是C#学习教程:通用约束忽略协方差分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/957735.html

(0)
上一篇 2021年11月22日
下一篇 2021年11月22日

精彩推荐