2015-05-05 69 views
0

我有幾種方法,其參數是一個派生類型:Func鍵與導出參數

bool Method1(ChildType1); 
bool Method2(ChildType2); 

隨着ChildType1和從ParentType的ChildType2 heritating。

我希望有一個委託,它可以接受方法1或方法2,但得到的編譯錯誤:

Func<ParentType, bool> MyDelegate = Method1; 

錯誤1,沒有超載的「方法一」比賽代表「Func鍵< ParentType的, 布爾>」

有沒有辦法避免這種情況?

+1

使用委託covarianc/contravariance。請參閱https://msdn.microsoft.com/en-us/library/ms173174.aspx – Maarten

+1

@Marteen委託在它們的* return *類型中是協變的(並且在它們的參數中是逆變的)。 OP需要協變參數,這是不可能的。 – dcastro

+0

你爲什麼要這麼做?底層需求是什麼? – Enigmativity

回答

4

想想,如果這是有可能將會發生什麼:

Func<ParentType, bool> MyDelegate = Method1; 

//Method1 does not accept a parameter of type ChildType2, but MyDelegate does 
MyDelegate(new ChildType2()); 

這並不是出於同樣的原因,爲什麼你不能投List<Dog>List<Animal>實例工作 - 因爲那麼你可以調用animals.Add(cat),這將不得不在運行時拋出異常,因爲貓不能被添加到狗列表中。