类型参数声明必须是标识符而不是类型
有一个基类有一个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
用作通用参数名称。如果可以,您的代码仍然无法执行您想要的操作也不会编译,因为编译器将无法在超类型上找到具有该签名的方法。)