【发布时间】:2014-08-29 20:36:50
【问题描述】:
此代码有效的原因是Enumerator 无法修改集合:
var roList = new List<string>() { "One", "Two", "Three" };
IEnumerable<object> objEnum = roList;
如果我们尝试用List<object> 而不是IEnumerable<object> 做同样的事情,我们会得到一个编译器错误,告诉我们不能将类型List<string> 隐式转换为List<object>。好吧,这是有道理的,在我看来,这是微软的一个很好的决定,作为从数组中吸取的教训。
但是,我想不通的是,为什么这条强硬规则适用于 ReadOnlyCollection 之类的东西?我们将无法修改 ReadOnlyCollection 中的元素,那么导致 Microsoft 阻止我们对只读内容使用协方差的安全问题是什么?是否有一种可能的方法来修改 Microsoft 试图解释的那种类型的集合,例如通过指针?
【问题讨论】:
-
“从数组中学到的一课”:关于数组协方差,这实际上是一个有意识的设计决定允许它,因为 Java 有它。结果证明这是一个非常糟糕的主意...blogs.msdn.com/b/ericlippert/archive/2007/10/17/…
-
@ThomasLevesque 很好,谢谢。
标签: c# covariance readonly-collection