【发布时间】:2014-02-06 12:29:39
【问题描述】:
取以下代码:
class BaseClassA { }
class DerivedClassA1 : BaseClassA { }
class BaseClassB { }
class DerivedClassB1 : BaseClassB { }
static class Operations
{
public static BaseClassA Method(BaseClassA baseA)
{
//...
return baseA;
}
public static TBaseClassB Method<TBaseClassB>(TBaseClassB baseB)
where TBaseClassB : BaseClassB, new()
{
//...
return baseB;
}
class Program
{
static void Main(string[] args)
{
BaseClassA baseA = new BaseClassA();
DerivedClassA1 derivedA1 = new DerivedClassA1();
DerivedClassB1 derivedB1 = new DerivedClassB1();
baseA = Operations.Method(baseA);
derivedA1 = Operations.Method(derivedA1); // Compilation error
derivedB1 = Operations.Method(derivedB1);
}
}
}
标记为// Compilation error 的行导致以下错误:
The type 'DerivedClassA1' cannot be used as type parameter
'TBaseClassB' in the generic type or method
'Operations.Method<TBaseClassB>(TBaseClassB)'.
There is no implicit reference conversion from 'DerivedClassA1'
to 'BaseClassB'.
似乎方法重载正在选择
Operations.Method<TBaseClassB>(TBaseClassB)
方法重载而不是Operations.Method(BaseClassA)
DerivedClassA1 类型的参数,这与我的预期相反。
为什么是这样?难道我做错了什么?是否有替代/正确的实现方式
我想要的,就是调用Method(BaseClassA)方法重载。
请注意,示例代码是我正在使用的一些实际代码的简化等效项 在。如果示例看起来做作,请致歉。
【问题讨论】:
标签: c# generics .net-4.0 overloading