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/23678263/

相关文章:

c# - XmlNodelist 中的 XmlNode

c# - 事件驱动的进程间通信(IPC)

.net - 创建 Entity Framework DbContext 时如何将现有模型 "attach"到现有 DbConnection?

c# - 创建一个假的虚拟驱动器(以处理对该驱动器的文件 I/O)

c# - DataContractJsonSerializer 异常

c# - 使用 Action<PointerClass*> 作为参数

java - Java 中的通用单例

c++ - 需要 C++ 中非常通用的 argmax 函数

C# 我可以在返回不同泛型类的非泛型类中创建泛型方法或属性吗?

c# - 如何将 4 位二进制数转换为 8 位二进制数?