类型参数声明必须是标识符,而不是类型
本文关键字:类型 标识符 类型参数 声明 | 更新日期: 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
作为通用参数名。即使你可以,你的代码仍然不会做你想要的,也不会编译,因为编译器将无法找到一个方法与超类型的签名。