C# 4.0 协变类的省略:深入了解
C# 4.0 引入了接口的通用变体,支持灵活的类型参数使用。 但是,此功能并未扩展到类。本文深入探讨了这种设计选择背后的基本原理。
实施的障碍
向类(例如,假设的 C<T>
类)引入协变方差带来了重大的实施挑战。 主要限制来自于 T
只能用作输出参数、setter 或字段。
这个约束是字段缺少 getter 的直接结果。 与属性不同,字段不提供只读访问权限。 因此,协变类不能拥有可变状态,严重限制了它的实际应用。
权衡成本和收益
虽然协变不可变类(如列表和堆栈)无疑具有优势,但在 C# 4.0 发布时,支持它们所需的对 C# 类型系统的大量修改并不被认为是合理的。
说明不可变结构中的协方差
以下示例演示了不可变堆栈中的协方差:
<code class="language-csharp">sealed class Stack<out T> { private readonly T head; private readonly Stack<T> tail; }</code>
这允许协变分配:
<code class="language-csharp">Stack<string> strings = null; strings = strings.Push("hello"); strings = strings.Push("goodbye"); Stack<object> objects = strings; // Covariant assignment objects = objects.Push(123); //This would be an error if Stack<T> was mutable</code>
由于堆栈的不变性,向堆栈添加整数仍然是类型安全的。 该操作不违反类型安全。
以上是为什么 C# 4.0 不支持协变类?的详细内容。更多信息请关注PHP中文网其他相关文章!