何时在c#中解析generics类型?

根据stackoverflow的这个答案,C#中的generics类型在运行时解析

但是,根据这个答案,在C#中,generics类型在编译时解析

我在这里想念的是什么?

换句话说,在编译时或运行时解析类型T

更新:

基于Oded的答案,在这种情况下,类型是封闭的具体类型(这意味着它将在编译时解析)

 class Program { static void Main() { var t = new Test(); } } public class Test { } 

将MSIL具有相当于

 class Program { static void Main() { var t = new Test(); } } public class Test { } 

问题是问题没有得到妥善解决。 两个人声称相反的事情:这些类型在运行时被“解析”,并且这些类型在编译时被“解析”。

由于它们彼此矛盾,它们必须通过“解决”来表示不同的东西。

我不知道一个类型被“解决”意味着什么。 但我确实知道什么是重载分辨率 。 当要求解决不涉及dynamic重载解决问题时,C#编译器根据有关generics类型的编译时信息确定在编译时调用哪个重载。 例如,如果你有:

 static void Main() { var d = new D(); var p = new P(); pN(d);//Displays In class B } class B { public void M()// Note, not virtual { Console.WriteLine("In class B"); } } class D : B { public new void M()// new, not overload { Console.WriteLine("In class D"); } } class P where T : B { public void N(T t) { tM(); } } 

即使P被实例化为P N总是调用BM 。 为什么? 因为当编译P.N必须解决确定tM含义的重载决策问题,并且在那时,编译器知道的最好是t必须是B ,所以它选择BM

如果这不是“解决”的意思,那么澄清问题。

您缺少开放和封闭generics类型的概念。

本质上,封闭generics类型是指您在generics参数上实际指定现有类型时(或者它们是由编译器推断的)。 例如:

 Nullable nulInt; 

开放generics类型是在运行时期间确定一个或多个generics类型的类型(因此, Nullable类是一个示例)。

  1. 第一个答案是关于方法参数
  2. 第二个是关于generics类型参数

这就是你所缺少的。

更准确地说: 1。默认情况下,C#是静态类型的,因此在传递参数时,您将获得最佳拟合类型和方法。 (另请查看有关“动态”参数的答案。)2。通过C#语法设置generics类型参数是关于静态类型。 通过反思来设置它是另一回事。

别的东西: “在.NET中”每个类型在运行时首次使用时都有一个初始化阶段。 (参见静态字段和静态构造函数)

so:所有类型都在运行时初始化 ,但是在编译时使用静态类型(或动态…),当需要“ 解析 ”时。

打开类型( myclass )不存在运行时。 但是未绑定的类型可以在运行时存在( myclass<> )。 要在运行时解析未绑定类型,您需要使用typeof运算符。

换句话说,除非使用typeof运算符,否则generics类型在编译时关闭。