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

本文关键字:类型 标识符 类型参数 声明 | 更新日期: 2023-09-27 18:07:55

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

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>();
        }
    }

但是这段代码无法编译。有人能看出这个错误吗?我确信,在我的扩展类,我想只返回字符串。怎么解呢?

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

不能用具体实现覆盖泛型方法;这不是泛型的工作原理。例如,Extended类必须能够处理对GetSomething<int>()的调用。

换句话说,重写方法的签名必须与它所重写的方法的签名相同。通过指定方法的具体泛型实现,可以更改其签名。

考虑使用这种方法:

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

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

(覆盖的语法在技术上是正确的,但由于其他原因也失败了。例如,不能使用关键字string作为通用参数名。即使你可以,你的代码仍然不会做你想要的,也不会编译,因为编译器将无法找到一个方法与超类型的签名。