下面的代码是一个简化,以显示正在发生的事情。当特别声明b1为基类型时,t1为Base类型,t2为Derived类型。 当b2用var声明时,t1和t2都是Derived类型。 所以这意味着为处理b1而生成的通用代码适用于基类型。这是设计,为什么?有没有办法绕过它,所以使用b1,t1和t2都是派生类型(不改变为var)?
class Base { }
class Derived : Base { }
class Program
{
static void Main()
{
Base b1 = new Derived();
var b2 = new Derived();
SomeMethod(b1);
SomeMethod(b2);
}
private static void SomeMethod<T>(T obj) where T : Base
{
var t1 = typeof(T);
var t2 = obj.GetType();
}
}
答案 0 :(得分:0)
你应该更好地创建一个接口,让Base从中获取。你可以做这样的事情
private static void SomeMethod<T>(T obj) where T : IBase
{
var t1 = typeof(T);
var t2 = obj.GetType();
}
现在T可以是任何来自IBase
的东西答案 1 :(得分:0)
在编译时推断出类型参数T
,这就是为什么当你使用参数Base b1
和Derived b2
调用方法时它会有所不同(使用var
只需要变量的类型与用于初始化它的表达式的类型相同。)
在运行时实现它的最简单方法是将参数强制转换为dynamic
SomeMethod((dynamic)b1);
这将基本上在运行时运行编译器并执行重载解析并使用运行时类型而不是编译时类型进行类型推断。
一般来说,您所询问的是双重调度 - 根据您调用其方法的对象的运行时类型以及参数的运行时类型选择要调用的方法。实现它的传统方法是使用visitor pattern。