2014-11-02 37 views
1

我有這樣的類和方法總彙與派生類參數

public class Base{ // members;} 
public class Derived : Base{// members} 
myMethod(IEnumerable<Base> in1); 

嘗試致電myMethod這樣的:

myMethod(IEnumerable<Derived > in2); 

,並得到編譯錯誤? 我應該如何解決這個問題

回答

1

你的期望是什麼叫做協方差。這意味着實際的泛型類型比所需的更具體。您可以看到協方差不適用於所有泛型類:A List<Derived>不應指定給List<Base>,因爲如果將Base實例添加到列表中,實際上是Derived實例的列表,將會發生什麼情況?因此IEnumerable協變IList不變量

此概念已應用於.NET 4.0中的集合類。當您使用.NET < 4的版本時,這些類是不變的。

+0

請注意,這個概念已經在.NET 4.0之前引入了,然而,在這個版本中它實際上已經被使用了,C#也有了關鍵字。還有_contravariance_,它適用於將基本類型轉換爲派生類型。 – IllidanS4 2014-11-02 14:11:31

+0

@ IllidanS4:好點,我誤解了那裏的文檔。 – Yogu 2014-11-02 14:12:58