【问题标题】:Using a generic base class as a parameter of a method使用泛型基类作为方法的参数
【发布时间】:2012-09-11 18:30:09
【问题描述】:

我有以下课程

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

我想做的是有一个方法可以将任何从B&lt;T&gt; 派生的类,如C1C2 作为参数。但是将方法声明为

public void MyMethod(B<T> x)

不起作用,它会产生编译器错误

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

我被困在这里了。为B&lt;T&gt; 创建一个非泛型基类是行不通的,因为我无法以这种方式从A&lt;T&gt; 派生。我能想到的唯一(丑陋的)解决方案是定义一个由B&lt;T&gt;“实现”的空虚拟接口。有没有更优雅的方式?

【问题讨论】:

    标签: c# .net mono derived-class generic-type-argument


    【解决方案1】:

    使用泛型方法:

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

    你可以这样称呼它:

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

    【讨论】:

    • 太棒了。我知道如果我使方法通用,它会起作用,但我认为我必须在显式调用时指定类型。非常感谢。
    【解决方案2】:

    在方法上指定T

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

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

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

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

    【讨论】:

      【解决方案3】:

      像这样更改方法的签名:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-24
        相关资源
        最近更新 更多