C#generic - 返回派生类的对象?

时间:2010-03-20 22:00:49

标签: c# c#-2.0

public class BaseClass{
  public static T Find<T>(object value){
     -- db.get<T>("params", value);
  }
}

public class Derived: BaseClass{
}

...
void someMethod(){
  Derived obj = Derived.Find<Derived>(1);
}

在上面的代码中,如何将Derived obj = Derived.FindDerived<Derived>(1);更改为Derived obj = Derived.Find(1);

3 个答案:

答案 0 :(得分:4)

如果您的方法签名是这样的

public static T Find<T>(T value)

然后你可以省略方法调用中的类型。但是,根据您给定的签名,编译器无法在不明确说明类型的情况下推断出类型。

答案 1 :(得分:2)

在许多情况下,编译器可以识别类型参数,但可以省略它们,但并非在所有情况下都省略。我认为返回值只是一个不受支持的情况,因为返回值不是方法签名的一部分。

Here是Eric Lippert关于类似问题的博文。

答案 2 :(得分:2)

您可以通过将BaseClass更改为泛型类来消除它:

public class BaseClass<T> {
    public static T Find(object value){
         -- db.get<T>("params", value);
    }
}

public class Derived: BaseClass<Derived> {

    void someMethod(){
      Derived obj = Derived.Find(1);
    }
}