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

Jag*_*ggu 8 c# generics

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

public abstract class Base
    {
        public virtual T GetSomething<T>()
        {
            return default(T);
        }
    }

    public class Extended : Base
    {
        public override string GetSomething<string>()
        {
            return string.Empty;

            //return base.GetSomething<T>();
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

cdh*_*wie 8

您不能使用具体实现覆盖泛型方法; 这不是泛型如何工作.例如,Extended该类必须能够处理调用GetSomething<int>().

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

考虑使用这种方法:

public override T GetSomething<T>()
{
    if (typeof(T) == typeof(string))
        return string.Empty;

    return base.GetSomething<T>();
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 或者将基类声明更改为`public abstract class Base <T>` (2认同)