6

我有以下课程

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>. 有没有更优雅的方式?

4

3 回答 3

10

使用通用方法:

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

你可以这样称呼它:

MyMethod(new B<string>());
MyMethod(new C1());
MyMethod(new C2());
于 2012-09-19T12:40:55.867 回答
4

在方法上指定T

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

或者可能在包含该方法的类上:

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

在这两种情况下,您都需要在原始类上指定相同的类型约束(如果有)

于 2012-09-19T12:41:04.937 回答
3

像这样更改方法的签名:

public void MyMethod<T>(B<T> x)
于 2012-09-19T12:41:42.123 回答