gpt4 book ai didi

c# - C# 语言如何防止泛型协变,除非它们不包含需要 T 作为输入的方法?

转载 作者:太空狗 更新时间:2023-10-29 17:36:58 25 4
gpt4 key购买 nike

我一直在阅读 .NET4.5 将带来的变化,以及 this博客文章我偶然发现了一些我既不知道也不理解的东西。

在谈到只读集合的​​实现时,Immo Landwerth说:

Unfortunately, our type system doesn’t allow making types of T covariant unless it has no methods that take T as an input. Therefore, we can’t add an IndexOf method to IReadOnlyList. We believe this is a small sacrifice compared to not having support for covariance.

从我显然有限的理解来看,他似乎是在说为了让我们能够调用一个需要 IReadOnlyList<Shape> 的方法。通过传入 IReadOnlyList<Circle> ,我们不能有 IReadOnlyList<T>.IndexOf(T someShape)方法。

我不明白类型系统如何阻止这种情况。谁能解释一下?

最佳答案

假设 Circle工具 IEquatable<Circle> . IReadOnlyList<Circle>.IndexOf 自然会使用它如果可用的话。现在,如果你能这样写:

IReadOnlyList<Circle> circles = ...;
IReadOnlyList<Shape> shapes = circles;
int index = shapes.IndexOf(new Square(10));

那最终会试图通过 SquareCircle.Equals(Circle)这显然不是一个好主意。

强制执行“输入位置没有 T 值”的规则在 C# 4 规范的第 13.1.3 节中。您还应该阅读 Eric Lippert's blog series on generic variance 很多详细信息。

关于c# - C# 语言如何防止泛型协变,除非它们不包含需要 T 作为输入的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11082476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com