协方差和反方差不支持值类型的原因

协方差和反方差不支持值类型的原因

IEnumerable<T>协变但它不支持值类型,只支持引用类型。成功编译了以下简单代码:

IEnumerable<string> strList = new List<string>();IEnumerable<object> objList = strList;

但从stringint将得到编译错误:

IEnumerable<int> intList = new List<int>();IEnumerable<object> objList = intList;

原因在MSDN:

方差仅适用于引用类型;如果为变量类型参数指定值类型,则该类型参数对于结果构造的类型是不变的。

我查了一下,发现提到的一些问题的原因是值类型与引用类型之间的装箱..但是它仍然没有让我头脑清醒很多,为什么拳击是原因?

请有人给出一个简单而详细的解释,为什么协方差和反方差不支持值类型,以及如何拳击影响这个?


catspeake
浏览 446回答 3
3回答

德玛西亚99

我想一切都是从LSP(Liskov替代原则),其中规定:如果Q(X)是关于T型对象x的一个可证明的性质,那么对于S类型的对象y,Q(Y)应该是真的,其中S是T的一个子类型。但是值类型,例如int不可替代的object在……里面C#..证明很简单:int&nbsp;myInt&nbsp;=&nbsp;new&nbsp;int();object&nbsp;obj1&nbsp;=&nbsp;myInt&nbsp;;object&nbsp;obj2&nbsp;=&nbsp;myInt&nbsp;;return&nbsp;ReferenceEquals(obj1,&nbsp;obj2);这回false即使我们分配同“引用”对象。
打开App,查看更多内容
随时随地看视频慕课网APP