2012-09-19 12 views
5

我有以下類一個通用的基類的方法的參數

public class A<T> 
{ 
} 
public class B<T> : A<T> 
{ 
} 
public class C1 : B<string> 
{ 
} 
public class C2 : B<int> 
{ 
} 

我想什麼向,是具有可以從B<T>派生的任何類,像C1C2的方法作爲參數。但聲明的方法

public void MyMethod(B<T> x) 

不起作用,它產生的編譯器錯誤

錯誤CS0246:類型或命名空間名稱'T」找不到。你是否缺少using指令或程序集引用? (CS0246)

我很困在這裏。爲B<T>創建非泛型基類將不起作用,因爲我無法從A<T>那樣派生。我能想到的唯一(醜陋的)解決方案是定義一個由B<T>「實施」的空虛擬接口。有沒有更優雅的方式?

回答

9

使用一般方法:

public void MyMethod<T> (B<T> x) 

而且你可以調用它像這樣:

MyMethod(new B<string>()); 
MyMethod(new C1()); 
MyMethod(new C2()); 
+0

真棒。我知道它會起作用,如果我使這個方法是通用的,但我認爲我必須在明確調用時指定類型。 非常感謝。 – mat

4

指定T的方法:

public void MyMethod<T>(B<T> x) 
含有類

或許方法:

public class Foo<T> 
{ 
    public void MyMethod(B<T> x){} 
} 

在這兩種情況下,你就必須在同類型的約束(如果有的話)的原班(ES)

3

改變你的方法是這樣的簽名規定:

public void MyMethod<T>(B<T> x) 
相關問題