- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在阅读 .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));
那最终会试图通过 Square
至 Circle.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/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!