类型参数声明必须是标识符而不是类型

有一个基类有一个generics类型的方法,我相信在我的派生中我将返回一个字符串。 这是我的代码:

public abstract class Base { public virtual T GetSomething() { return default(T); } } public class Extended : Base { public override string GetSomething() { return string.Empty; //return base.GetSomething(); } } 

但是这段代码没有编译。 任何人都可以发现错误吗? 我确信在我的Extended类中我只想返回字符串。 我该如何解决这个问题?

您不能使用具体实现覆盖generics方法; 这不是generics如何工作。 例如, Extended类必须能够处理对GetSomething()调用。

换句话说,覆盖方法的签名必须覆盖它的方法相同 。 通过指定方法的具体通用实现,可以更改其签名。

考虑使用这种方法:

 public override T GetSomething() { if (typeof(T) == typeof(string)) return string.Empty; return base.GetSomething(); } 

请注意,JIT应该在编译此方法的特定实例时优化掉条件。 (如果没有那么它不是一个非常好的JIT!)

(覆盖的语法在技术上是正确的,但也因其他原因而失败。例如,您不能将关键字string用作通用参数名称。如果可以,您的代码仍然无法执行您想要的操作也不会编译,因为编译器将无法在超类型上找到具有该签名的方法。)