c# - 为什么 C# 4.0 中的类没有泛型变化?

标签 c# .net generics c#-4.0

如果我们对接口(interface)有它,为什么我们不对类也有它呢?我们在使用的过程中会遇到什么问题?

最佳答案

假设你有一个类 C<T>那在 T 中是协变的。它的实现可能是什么样的? T必须只出去。这意味着 C<T>不能有任何采用 T 的方法,任何带有 setter 的 T 类型的属性,或任何 T 类型的字段,因为字段在逻辑上与属性 setter 相同; T 进去了。

就 T 而言,您可以使用协变类构建的唯一有用的东西几乎是不可变的。现在,我认为拥有协变不可变列表和堆栈以及类类型之类的东西会很棒。但是,该功能显然并没有那么出色,以至于它可以清楚地证明在使类型系统 native 支持协变不可变类类型方面的大量支出是合理的。

上面的一条评论要求举一个例子说明这在什么地方有用。考虑以下草图:

sealed class Stack<out T>
{
    private readonly T head;
    private readonly Stack<T> tail;
    public T Peek() { return head; }
    public Stack<T> Pop() { return tail; }
    public Stack(T head, Stack<T> tail)
    {
        this.tail = tail;
        this.head = head;
    }
}
static class StackExtensions
{
    public static Stack<T> Push<T>(this Stack<T> tail, T head) 
    {
        return new Stack<T>(head, tail);
    }
    public static bool IsEmpty<T>(this Stack<T> stack)
    {
        return stack == null;
    }
}

假设您有协变类。现在你可以说

Stack<string> strings = null;
strings = strings.Push("hello");
strings = strings.Push("goodbye");
Stack<object> objects = strings;
objects = objects.Push(123);

嘿,我们只是将一个整数压入一堆字符串,但一切都很好!没有理由不能保证类型安全。在可变数据结构上违反类型安全的操作可以在不可变数据结构上安全地协变。

关于c# - 为什么 C# 4.0 中的类没有泛型变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2733346/

相关文章:

c# - RaisePropertyChanged 在 TwoWay Bound 属性上抛出 StackOverflow 异常

c# - 尝试使用 FileStream 和 StreamWriter 编写 LogFile 的异常

.net - QueryOver 是否有像 LINQ 一样的查询生成器或扩展点?

c# - 从 C# 调用 tap_example.py 获取 Membase TAP Stream

c# - 有效锁定资源,由字符串标识

C#.net 将带有附件的电子邮件排队发送的最佳方式

c# - 如何将参数传递给非默认构造函数?

Java 从类构造通用实例

swift - 使用通用函数模拟协议(protocol)

java - 摆脱 Unchecked 覆盖 : return type requires unchecked conversion