1

Hi here is my example let's say

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();
}

The result is clazz= B T= A ????? why inference generic type doesn't take into account polymorphism ?

4

4 回答 4

6

结果是 clazz= BT= A ????? 为什么推理泛型类型不考虑多态性?

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

test<A>(b);

bat 执行时的值B是无关紧要的,因为这对于类型推断来说为时已晚。

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

dynamic b = new B();
test(b);
于 2013-11-07T22:52:10.943 回答
3

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

于 2013-11-07T22:52:19.427 回答
1

我不认为泛型是问题。typeof这与和之间的差异有关GetTypeGetType在运行时typeof确定类型,在编译时确定该实例的类型。您将变量声明为类型 A,因此它是编译时类型。无论您是否将继承类的实例分配给该引用都没关系,您将其声明为类型 A,这就是typeof返回的内容。GetType正在返回引用当前指向的实例的类型,它不关心你声明的变量是什么,而是实例实际上是什么。

于 2013-11-07T22:53:00.507 回答
0

当您将类型表达式传递A给确定泛型的参数时,TTA. 对象的价值没有发挥作用;它可能是null,一切仍然有效。

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

于 2013-11-07T22:52:00.613 回答