Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用泛型基类作为方法的参数_C#_.net_Mono_Derived Class_Generic Type Argument - Fatal编程技术网

C# 使用泛型基类作为方法的参数

C# 使用泛型基类作为方法的参数,c#,.net,mono,derived-class,generic-type-argument,C#,.net,Mono,Derived Class,Generic Type Argument,我有以下课程 public class A<T> { } public class B<T> : A<T> { } public class C1 : B<string> { } public class C2 : B<int> { } 如果不工作,则会产生编译器错误 错误CS0246:找不到类型或命名空间名称“T”。是否缺少using指令或程序集引用?(CS0246) 我被困在这里了。为B创建一个非泛型基类是行不通的,因为那样我就无

我有以下课程

public class A<T>
{
}
public class B<T> : A<T>
{
}
public class C1 : B<string>
{
}
public class C2 : B<int>
{
}
如果不工作,则会产生编译器错误

错误CS0246:找不到类型或命名空间名称“T”。是否缺少using指令或程序集引用?(CS0246)

我被困在这里了。为
B
创建一个非泛型基类是行不通的,因为那样我就无法从
a
派生。我能想到的唯一(丑陋的)解决方案是定义一个空的虚拟接口,它由
B
实现。还有更优雅的方法吗?

使用通用方法:

public void MyMethod<T> (B<T> x)
publicsvoidmymethod(bx)
你可以这样称呼它:

MyMethod(new B<string>());
MyMethod(new C1());
MyMethod(new C2());
MyMethod(新的B());
MyMethod(新C1());
MyMethod(新C2());

在方法上指定
T

public void MyMethod<T>(B<T> x)
public class Foo<T>
{
    public void MyMethod(B<T> x){}
}
publicsvoidmymethod(bx)
或者在包含该方法的类上:

public void MyMethod<T>(B<T> x)
public class Foo<T>
{
    public void MyMethod(B<T> x){}
}
公共类Foo
{
公共无效MyMethod(Bx){}
}

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

更改方法的签名,如下所示:

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

太棒了。我知道,如果我将该方法设置为泛型,那么它会起作用,但我认为必须在显式调用时指定类型。谢谢。