在.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