根据stackoverflow的this回答,C#中的泛型类型在运行时解析。
但是,根据this回答,在C#中,泛型类型在编译时解析。
我在这里缺少什么?
换句话说,在编译时或运行时解析了类型T
吗?
更新
基于Oded的回答,在这种情况下,类型是封闭的具体类型(这意味着它将在编译时解析)
class Program
{
static void Main()
{
var t = new Test<int>();
}
}
public class Test<T>
{
}
MSIL是否具有等效的
class Program
{
static void Main()
{
var t = new Test();
}
}
public class Test<int>
{
}
答案 0 :(得分:22)
问题是这个问题没有得到妥善解决。两个人声称相反的事情:这些类型在运行时被“解析”,并且这些类型在编译时被“解析”。
由于它们相互矛盾,它们必须通过“已解决”来表示不同的东西。
我不知道某种类型被“解决”意味着什么。但我确实知道重载决议是什么。当被要求解决不涉及dynamic
的重载解析问题时,C#编译器根据确定在编译时调用的过载关于泛型类型的编译时间信息。例如,如果你有:
static void Main()
{
var d = new D();
var p = new P<D>();
p.N(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<T> where T : B
{
public void N(T t)
{
t.M();
}
}
即使N
被B.M
实例化, P<T>
始终会调用P<D>
。为什么?因为编译t.M
时必须解决确定P<T>.N
含义的重载决策问题,并且在那时,编译器知道的最好是{{ 1}}必须为t
,因此选择B
。
如果这不是“解决”的意思,那么请澄清问题。
答案 1 :(得分:12)
您缺少open and closed generic types的概念。
本质上,封闭泛型类型是指您在泛型参数上实际指定现有类型时(或者它们是由编译器推断的)。例如:
Nullable<int> nulInt;
开放泛型类型是在运行时期间确定一个或多个泛型类型的类型(因此,Nullable<T>
类是一个示例)。
答案 2 :(得分:1)
这就是你所缺少的。
更确切地说: 1.默认情况下,C#是静态类型的,因此在传递参数时,您将获得最佳拟合类型和方法。 (另请查看有关“动态”参数的答案。) 2.通过C#语法设置泛型类型参数是关于静态类型。通过反思来设置它是另一回事。
别的东西: “在.NET中”每种类型在运行时首次使用时都有初始化阶段。 (参见静态字段和静态构造函数)
<强>这样:强> 所有类型都在运行时初始化,但在编译时使用静态类型(或动态...),当需要“已解析”时。
答案 3 :(得分:1)
打开类型(myclass<T>
)不存在运行时。但是未绑定的类型可以在运行时存在(myclass<>
)。要在运行时解析未绑定类型,您需要使用typeof运算符。
换句话说,除非使用typeof运算符,否则泛型类型在编译时关闭。