【问题标题】:Weird generics compile error奇怪的泛型编译错误
【发布时间】:2010-06-06 19:45:18
【问题描述】:

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

受保护的虚拟 ReturnType Create() where T : ReturnType {}

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

protected override ReturnTypeChild Create() // ReturnTypeChild 继承 ReturnType
{
  返回 base.Create 作为 ReturnTypeChild;
}

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

类型“T”不能用作泛型类型或方法“Create()”中的类型参数“T”。没有从 'T' 到 'ReturnType' 的装箱转换或类型参数转换。

在孩子的 override 上重复 where 子句也会报错:

override 和显式接口实现方法的约束是从基方法继承的,所以不能直接指定

那么我在这里做错了什么?

【问题讨论】:

  • 应该是protected override BarChild Foo<T>()?你能给出正确的名字吗? Foo 和 Bar 伤了我的头。
  • 不应该是 return base.Foo as BarChild();?
  • 您的代码有各种各样的问题(例如,您的重写方法缺少其通用参数,您的 return 语句在错误的地方有括号等)。如果您对问题进行了最小限度的复制,并解决了所有明显的问题,您更有可能获得有用的答案。
  • 啊,StackOverflow 删除了 之间的东西。我很抱歉。我会尝试以某种方式修复它..
  • 好的,我把所有东西都修好了 :) 那么,有人吗?

标签: c# .net generics


【解决方案1】:

这行得通。您必须将返回类型设为通用:

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 次吗?类需要缩进以正确格式化 AFAICT
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2011-01-22
    • 2016-01-23
    • 2010-10-07
    • 1970-01-01
    相关资源
    最近更新 更多