根据堆栈溢出时的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>
{
}
发布于 2013-07-18 21:44:54
问题是这个问题没有很好地提出。两个人声称的是相反的东西:类型在运行时被“解析”,类型在编译时被“解析”。
因为它们是相互矛盾的,所以它们的意思必然是不同的。
我不知道“解决”一种类型意味着什么。不过,我知道什么是过载解决方案。当被要求解决不涉及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
含义的重载解析问题必须得到解决,而在那时,编译器知道的最好的就是t
必须是B
,所以它选择了B.M
。
如果这不是你所说的“解决”,那就澄清这个问题。
发布于 2013-07-18 21:30:46
您缺少了open and closed generic types的概念。
本质上,封闭泛型类型是指在泛型参数/s上指定现有类型(或者由编译器推断)。例如:
Nullable<int> nulInt;
开放泛型类型是在运行时确定一个或多个泛型类型的类型(因此,Nullable<T>
类是一个示例)。
发布于 2013-07-18 21:52:32
这就是你错过的。
更精确地说:默认情况下, 1. C#是静态类型的,所以当传递参数时,您将得到最佳的拟合类型和方法。(还可以查看有关“动态”参数的答案。) 2.通过C#语法设置泛型类型参数是关于静态类型的。通过反思来设定它是另外一回事。
: "in .NET“每种类型在运行时第一次使用时都有一个初始化阶段。(请参见静态字段和静态构造函数)
so:在运行时初始化所有类型,但使用静态类型(或动态类型.)在编译时,它们需要“解决”。
https://stackoverflow.com/questions/17734247
复制相似问题