代码之家  ›  专栏  ›  技术社区  ›  Jouke van der Maas

奇怪的泛型编译错误

  •  5
  • Jouke van der Maas  · 技术社区  · 15 年前

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

    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 回复  |  直到 15 年前
        1
  •  3
  •   Igor Zevaka    15 年前

    这很管用。必须使返回类型为泛型:

    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 :

    重写的基方法必须具有 方法。

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

        2
  •  2
  •   John Saunders    15 年前