通用类型推断不考虑多态性

时间:2013-11-07 22:49:18

标签: c# generics

嗨,这是我的例子,让我们说

class A { }
class B : A { }
void test<T>(T clazz)
{
     Console.WriteLine("clazz type = {0} T type = {1}",
                 clazz.GetType().Name,
                 typeof(T).Name);
}

static void Main(string[] args)
{         
    A b = new B(); 
    test(b);
    Console.ReadLine();
}

结果是clazz = B T = A ?????为什么推理泛型类型没有考虑多态性?

4 个答案:

答案 0 :(得分:6)

  

结果是clazz = B T = A ?????为什么推理泛型类型没有考虑多态性?

类型推断在编译时执行。变量b compile 时间类型是A,因此编译器推断出您的意思:

test<A>(b);

执行时b的值为B这一事实无关紧要,因为对于类型推断来说太迟了。

从C#4开始,您可以使用dynamic将类型推断推迟到执行时间,但是:

dynamic b = new B();
test(b);

答案 1 :(得分:3)

typeof在编译时工作,也就是说,它无法知道多态性,因为当时还没有确定变量中存储的实际对象是什么类型。但是,GetType()在运行时工作,可以知道实际的类型。

答案 2 :(得分:1)

我不认为仿制药是个问题。它与typeofGetType之间的差异有关。 GetType在运行时确定类型,typeof在编译时确定该实例的类型。您将变量声明为类型A,因此编译时类型。无论是否将继承类的实例分配给该引用都无关紧要,您将其声明为类型A,即typeof返回的内容。 GetType返回引用当前指向的实例的类型,它不关心您声明变量的内容,但实际上是实例的内容。

答案 3 :(得分:0)

将类型为A的表达式传递给确定通用T的参数时,T将为A。对象的不起作用;它可能是null,一切都会有效。

(您可以将其视为在编译时确定的类型,但这不一定是真的,只是必然可能。)