何时在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
时必须解决确定tM
含义的重载决策问题,并且在那时,编译器知道的最好是t
必须是B
,所以它选择BM
。
如果这不是“解决”的意思,那么澄清问题。
您缺少开放和封闭generics类型的概念。
本质上,封闭generics类型是指您在generics参数上实际指定现有类型时(或者它们是由编译器推断的)。 例如:
Nullable nulInt;
开放generics类型是在运行时期间确定一个或多个generics类型的类型(因此, Nullable
类是一个示例)。
- 第一个答案是关于方法参数
- 第二个是关于generics类型参数
这就是你所缺少的。
更准确地说: 1。默认情况下,C#是静态类型的,因此在传递参数时,您将获得最佳拟合类型和方法。 (另请查看有关“动态”参数的答案。)2。通过C#语法设置generics类型参数是关于静态类型。 通过反思来设置它是另一回事。
别的东西: “在.NET中”每个类型在运行时首次使用时都有一个初始化阶段。 (参见静态字段和静态构造函数)
so:所有类型都在运行时初始化 ,但是在编译时使用静态类型(或动态…),当需要“ 解析 ”时。
打开类型( myclass
)不存在运行时。 但是未绑定的类型可以在运行时存在( myclass<>
)。 要在运行时解析未绑定类型,您需要使用typeof运算符。
换句话说,除非使用typeof运算符,否则generics类型在编译时关闭。