根据stackoverflow的这个答案,C#中的泛型类型在运行时被解析.
但是,根据这个答案,在C#中,泛型类型在编译时被解析.
我在这里错过了什么?
换句话说,是T在编译时还是运行时解析了类型?
更新:
基于Oded的答案,在这种情况下,类型是封闭的具体类型(这意味着它将在编译时解析)
class Program
{
static void Main()
{
var t = new Test<int>();
}
}
public class Test<T>
{
}
Run Code Online (Sandbox Code Playgroud)
将MSIL具有相当于
class Program
{
static void Main()
{
var t = new Test();
}
}
public class Test<int>
{
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 22
问题是问题没有得到妥善解决.两个人声称相反的事情:这些类型在运行时被"解析",并且这些类型在编译时被"解析".
由于它们相互矛盾,它们必须通过"已解决"来表示不同的东西.
我不知道一个类型被"解决"意味着什么.但我确实知道什么是重载分辨率.当要求解决不涉及的重载解决问题时,dynamicC#编译器根据有关泛型类型的编译时信息确定在编译时调用哪个重载.例如,如果你有:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
NB.M 即使P<T>被实例化为,也P<D>总是调用.为什么?因为在编译时t.M必须解决确定其含义的重载决策问题,并且在那时,编译器知道的最好是必须的,因此它选择.P<T>.NtBB.M
如果这不是"解决"的意思,那么澄清问题.
Ode*_*ded 12
您缺少开放和封闭泛型类型的概念.
本质上,闭合泛型类型是指您在泛型参数上实际指定现有类型时(或者它们是由编译器推断的).例如:
Nullable<int> nulInt;
Run Code Online (Sandbox Code Playgroud)
开放泛型类型是在运行时期间确定一个或多个泛型类型的类型(因此,Nullable<T>类是一个示例).
| 归档时间: |
|
| 查看次数: |
2197 次 |
| 最近记录: |