【发布时间】:2010-10-30 06:42:03
【问题描述】:
IEnumerable<T>、IComparable<T> 和其他一些现在是类型变体的。 IList<T>、ICollection<T> 和许多其他人不是。为什么?
【问题讨论】:
标签: .net generics types covariance contravariance
IEnumerable<T>、IComparable<T> 和其他一些现在是类型变体的。 IList<T>、ICollection<T> 和许多其他人不是。为什么?
【问题讨论】:
标签: .net generics types covariance contravariance
.NET Framework 4.0 引入了安全 co/contra-variance。 IList<T> 和 ICollection<T> 在输入和输出位置都具有 T 而IEnumerable<T> 具有 T 仅在输出位置 和 IComparable<T> 具有 T 仅在输入位置职位。
假设IList<T> 支持的类型差异:
static void FailingMethod(IList<object> list) {
list[0] = 5;
}
static void Test() {
var a = new List<string>();
a[0] = "hello";
FailingMethod(a); // if it was variant, this method call would be unsafe
}
【讨论】:
【讨论】:
Anders Hejlseberg 在他的演讲“C# 的未来”中进行了简短但富有启发性的讨论,描述了协变/逆变。他关于协变和逆变的讨论从演讲开始的 50 分 17 秒开始。
【讨论】: