2013-10-27 158 views
2

好了的實例的方法,所以我有類調用與派生類中派生泛型類型

class B<T> : A<T> 
class L : K 

和方法

void Method(A<K> a) {...} 

我想要做的就是這個

var b = new B<L>(); 
Method(b); //error 

但是不可能b正確的類型。事實上,這是不可能做出這種投

A<K> t = new A<L>(); //error 

我真的想不改變方法的內部。我對B和/或L進行更改沒有任何問題。我有任何選擇可以採取某種解決方法嗎?我想應該可以讓Method在b上執行所有的方法調用等等,因爲B從A派生而L派生於K?您使用C#4.0+

+4

請參閱http://msdn.microsoft.com/en-us/library/dd799517.aspx –

+1

另請參閱:http://msdn.microsoft.com/en-us/library/vstudio/dd997386 .aspx – Polaris878

+0

這正是我所需要的。非常感謝你! – madsbirk

回答

1

假設,需要聲明A的類型參數被協變:

public class A<out T> where T : K 
{ 
} 

這應該允許你傳遞B的一個變量的一個

的參數

一些更多的信息:

Understanding Covariant and Contravariant interfaces in C#

很顯然,在OOP你可以通過派生類型來聲明爲基本類型的參數(這是誰點)。協方差允許相同的事情 - 但對於類型參數,這是你在這種情況下需要的。

+0

除了我需要成爲這個工作的接口外,這是我正在尋找的解決方案。我可以在A之上聲明一個接口。謝謝! – madsbirk

+0

是的你是對的,這隻會在接口上工作,我的壞! –