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

Foo*_*Foo 14 c# generics

根据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>类是一个示例).