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

时间:2013-07-18 21:27:49

标签: c# generics

根据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>
{        
}

4 个答案:

答案 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();
    }
}
即使NB.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. 第一个答案是关于方法参数
  2. ,第二个是关于泛型类型参数
  3. 这就是你所缺少的。

    更确切地说:  1.默认情况下,C#是静态类型的,因此在传递参数时,您将获得最佳拟合类型和方法。 (另请查看有关“动态”参数的答案。)  2.通过C#语法设置泛型类型参数是关于静态类型。通过反思来设置它是另一回事。

    别的东西: “在.NET中”每种类型在运行时首次使用时都有初始化阶段。 (参见静态字段和静态构造函数)

    <强>这样: 所有类型都在运行时初始化,但在编译时使用静态类型(或动态...),当需要“已解析”时。

答案 3 :(得分:1)

打开类型(myclass<T>)不存在运行时。但是未绑定的类型可以在运行时存在(myclass<>)。要在运行时解析未绑定类型,您需要使用typeof运算符。

换句话说,除非使用typeof运算符,否则泛型类型在编译时关闭。