我大致明白接口,繼承和多態,但有一件事我不解。的IList <T>和列表<T>轉換與接口
在這個例子中,貓實現IAnimal當然名單實現IList的:
IList<IAnimal> cats = new List<Cat>();
,但它會產生一個編譯錯誤(無法隱式轉換類型...) 。如果我使用Cat繼承的asbtract超類[動物],它也不起作用。但是,如果我有貓更換IAnimal:
IList<Cat> cats = new List<Cat>();
它編譯罰款。
在我心中,因爲貓實現IAnimal,第一個例子應該是可以接受的,讓我們返回一個接口列表和所包含的類型兩者。
誰能解釋爲什麼它是不是有效?我確定有一個合理的解釋。
+1:內容豐富且和往常一樣有用:) – Juliet 2011-06-01 16:26:05
謝謝埃裏克。我一定會閱讀你的文章。還要問一個不斷重複的問題......下次會做更好的搜索。 – Curtmantle 2011-06-01 16:32:04
@Mark:不客氣,不用擔心;事實上,這個問題被問到這麼多是促使首先將功能添加到C#4的原因之一。很明顯,人們有直覺認爲一般方差應該是類型系統的一部分。現在只是教育人們關於什麼樣的差異可證明是安全的。 – 2011-06-01 16:36:00