c#协方差和值类型限制
> C#中的协方差允许将派生的接口类型分配给其基本接口类型。 这使得将派生类型的对象视为基本类型的对象。 但是,此功能有意限制对价值类型。
拳击和身份的作用>
>此限制的核心原因是拳击过程。 当将值类型分配到接口变量时,它是盒装的,将其转换为堆上的参考类型。这会创建一个新的对象,以更改原始值的身份。 已经居住在堆上的参考类型,不要经历这种改变身份的拳击。> 维持身份对于协方差至关重要。 如果允许价值类型的协方差,则修改基本类型集合中的派生类型对象可能会导致意外的行为和身份不一致。
说明性示例
以下代码片段演示了问题:
虽然(假设)协方差引起的初始分配起作用,但修改
>出乎意料地改变了<code class="language-csharp">IEnumerable<int> intList = new List<int>(); IEnumerable<object> objList = intList; // Covariance (if allowed for value types) intList.Add(10); Console.WriteLine(((List<int>)objList)[0]); // Output: 10 intList[0] = 20; Console.WriteLine(((List<int>)objList)[0]); // Output: 0 (Unexpected!)</code>中的盒装值,突出显示了防止C#中价值类型的协方差支持的身份问题。 第二个
显示了0的意外输出,因为盒装intList
objList
在修改后未直接链接到Console.WriteLine
inint
>。 objList
保留对int
的引用。intList
>
以上是为什么协方差不支持C#中的价值类型?的详细内容。更多信息请关注PHP中文网其他相关文章!