有一个基类有一个泛型类型的方法,我相信在我的派生中我将返回一个字符串。这是我的代码:
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类中我只想返回字符串。我该如何解决这个问题?
答案 0 :(得分:8)
您不能使用具体实现覆盖泛型方法;这不是泛型如何工作。 Extended
类必须能够处理对GetSomething<int>()
的调用。
换句话说,重写方法的签名必须与它覆盖的方法相同。通过指定方法的具体通用实现,可以更改其签名。
考虑使用这种方法:
public override T GetSomething<T>()
{
if (typeof(T) == typeof(string))
return string.Empty;
return base.GetSomething<T>();
}
请注意,JIT应该在编译此方法的特定实例时优化条件。 (如果没有那么它不是一个非常好的JIT!)
(覆盖的语法在技术上是正确的,但也因其他原因而失败。例如,您不能使用关键字string
作为通用参数名称。如果可以,您的代码仍然不会做你想要的,也不会编译,因为编译器将无法在超类型上找到带有该签名的方法。)