我有一個問題:泛型問題 - 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中做類似的事情?
我有一個問題:泛型問題 - 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中做類似的事情?
簡答:不,沒有辦法。
長答案:不,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>());
這就是協方差你想有在C#3.0中並沒有多大的作用,除了使用強制轉換之外。
一個Test<DerivedClass>
不從Test<Base>
從Base
繼承即使DerivedClass
繼承。
您不能將'Test
對不起,我的意思是從一個'object'投射。 – 2011-05-09 13:27:03
代碼'Test
你對代表類型有什麼意義?你能詳細說明一下C#4.0嗎? – Twinhelix 2011-05-09 13:38:22
請在這裏閱讀關於該主題:http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx – 2011-05-09 14:02:21
此外,這個答案解釋了爲什麼類不是共同的 - 或逆變http://stackoverflow.com/questions/2733346/why-isnt-there-generic-variance-for-classes-in-c-4-0/2734070#2734070 – 2011-05-09 14:03:48