在.NET引用类型数组中是协变量。这被认为是一个错误。不过,我不明白为什么这么糟糕请考虑下面的代码:为什么阵列协方差被认为如此可怕?
string[] strings = new []{"Hey there"};
object[] objects = strings;
objects[0] = new object();
哦,这个编译并会在运行时失败。正如我们试图将一个对象粘贴到一个字符串[]中。好吧,我同意,很臭,但T []数组延伸,也实现了IList
(和IList<T>
,我不知道如果它实现IList<BaseType>
...>。这两个数组和IList的允许我们犯同样的错误可怕。
string[] strings = new []{"Hey there"};
Array objects = strings;
objects.SetValue(new object(),new[]{0});
IList的版本
string[] strings = new []{"Hey there"};
IList objects = strings;
objects[0] = new object();
的T []类由CLR生成,并且必须包括在set_Item
方法是等效的类型检查(阵列实际上没有一个)。
是担心设置为T []必须在运行时进行类型检查(这违反了编译时期望的类型安全性)?为什么在有相同的手段通过上面提供的手段在脚下射击自己时,阵列展示这种属性会有害吗?
你是不是指对象[0] = new object(); ? – 2010-11-30 19:07:28
是的,赶上! – 2010-11-30 19:09:52