首页 >后端开发 >C++ >为什么协方差不支持C#中的价值类型?

为什么协方差不支持C#中的价值类型?

Barbara Streisand
Barbara Streisand原创
2025-01-30 21:26:13712浏览

Why Doesn't Covariance Support Value Types in C#?

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的意外输出,因为盒装intListobjList在修改后未直接链接到Console.WriteLineinint>。 objList保留对 boxedint的引用。intList>

以上是为什么协方差不支持C#中的价值类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn