2011-05-09 85 views
0

我有一個問題:泛型問題 - C#3.0

class Base 
{ 
} 

class DerivedClass : Base 
{ 
} 

class Test<T> where T : Base 
{ 
} 

和像這樣:

Test<Base> a = new Test<DerivedClass>();

我覺得有它圍繞在C#4.0的方式,但有什麼辦法在C#3中做類似的事情?

回答

3

簡答:不,沒有辦法。
長答案:不,C#3.0和C#4.0都沒有辦法,因爲C#3.0根本不支持協變和逆變,只能在C#4.0中的委託類型和接口上使用。

UPDATE:
如果你想保存這個類的幾個實例在列表中,獨立於具體類型的T的,一個解決方法看起來是這樣的:
創建到處使用Base你的接口ITest將使用T。通過使用顯式接口實現,使Test<T>實現該接口並隱藏ITest中的方法。使用ITest作爲您的方法的參數類型。 示例代碼:

class Base 
{ 
    public int Info { get; set; } 
} 

class Derived : Base 
{ 
    public int Info2 { get; set; } 
} 

interface ITest 
{ 
    Base Data { get; set; } 
} 

class Test<T> : ITest 
    where T : Base 
{ 
    public T Data { get { return (T) (((ITest) this).Data); } set { ((ITest) this).Data = value; } } 

    Base ITest.Data { get; set; } 
} 

List<ITest> list = new List<ITest>(); 
list.Add(new Test<Base>()); 
list.Add(new Test<Derived>()); 

如果你只是想傳遞一個類的方法,而不需要特定T,你可以讓你的方法一般也:

void YourMethod<T>(Test<T> test) where T : Base 
{ 
    Console.WriteLine(test.Data.Info); 
} 

YourMethod(new Test<Base>()); 
YourMethod(new Test<Derived>()); 
+0

你對代表類型有什麼意義?你能詳細說明一下C#4.0嗎? – Twinhelix 2011-05-09 13:38:22

+0

請在這裏閱讀關於該主題:http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx – 2011-05-09 14:02:21

+0

此外,這個答案解釋了爲什麼類不是共同的 - 或逆變http://stackoverflow.com/questions/2733346/why-isnt-there-generic-variance-for-classes-in-c-4-0/2734070#2734070 – 2011-05-09 14:03:48

0

這就是協方差你想有在C#3.0中並沒有多大的作用,除了使用強制轉換之外。

一個Test<DerivedClass>不從Test<Base>Base繼承即使DerivedClass繼承。

+0

您不能將'Test '強制轉換爲'Test '! – 2011-05-09 13:23:50

+0

對不起,我的意思是從一個'object'投射。 – 2011-05-09 13:27:03

+0

代碼'Test a = new Test ();'是不可能的。無論你如何施展...... – 2011-05-09 13:28:25