奇怪的泛型编译错误

时间:2010-06-06 19:45:18

标签: c# .net generics

我有两个类,一个基类和一个子类。在基类中,我定义了一个通用的虚方法:

protected virtual ReturnType Create<T>() where T : ReturnType {}

然后在我的孩子课上我尝试这样做:

protected override ReturnTypeChild Create<T>() // ReturnTypeChild inherits ReturnType
{ 
  return base.Create<T> as ReturnTypeChild; 
}

Visual Studio给出了这个奇怪的错误:

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'Create()'. There is no boxing conversion or type parameter conversion from 'T' to 'ReturnType'.

重复子项覆盖的where子句也会出错:

Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly

那我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

这很有效。你必须使返回类型通用:

public class BaseClass {
  public virtual T Create<T>() where T : BaseClass, new()  {
   var newClass = new T();
   //initialize newClass by setting properties etc
   return newClass;
  }
 }

 public class DerivedClass : BaseClass {
  public override T Create<T>() {
   var newClass =  base.Create<T>();
   //initialize newClass with DerivedClass specific stuff
   return newClass;
  }
 }

void Test() {

 DerivedClass d = new DerivedClass() ;
 d.Create<DerivedClass>();
}

这些是基本的C# override rules

  

重写的基本方法必须具有   与覆盖相同的签名   方法

这意味着相同的返回类型和相同的方法参数。

答案 1 :(得分:2)

您的覆盖不能更改返回类型,即使返回类型派生自基类方法的返回类型。你必须做一些像伊戈尔上面做的事情,并使返回类型通用。