首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >泛型类型何时在c#中解析?

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

Stack Overflow用户
提问于 2013-07-18 21:27:49
回答 5查看 3.3K关注 0票数 16

根据堆栈溢出时的this答案,C#中的泛型类型在运行时中被解析。

但是,根据this答案,在C#中,泛型类型是在编译时解析的。

我在这里错过了什么?

换句话说,T类型是在编译时解析还是在运行时解析?

更新:

基于Oded的回答,在这样的情况下,类型是封闭的具体类型(这意味着它将在编译时被解析)

代码语言:javascript
运行
复制
class Program
{
    static void Main()
    {
        var t = new Test<int>();
    }  
}

public class Test<T>
{   
}

MSIL是否会有相当于

代码语言:javascript
运行
复制
class Program
{
    static void Main()
    {
        var t = new Test();
    }
}

public class Test<int>
{        
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-07-18 21:44:54

问题是这个问题没有很好地提出。两个人声称的是相反的东西:类型在运行时被“解析”,类型在编译时被“解析”。

因为它们是相互矛盾的,所以它们的意思必然是不同的。

我不知道“解决”一种类型意味着什么。不过,我知道什么是过载解决方案。当被要求解决不涉及dynamic的重载解析问题时,C#编译器根据有关泛型类型的编译时信息,确定在编译时调用哪个重载。因此,例如,如果您有:

代码语言:javascript
运行
复制
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

如果这不是你所说的“解决”,那就澄清这个问题。

票数 23
EN

Stack Overflow用户

发布于 2013-07-18 21:30:46

您缺少了open and closed generic types的概念。

本质上,封闭泛型类型是指在泛型参数/s上指定现有类型(或者由编译器推断)。例如:

代码语言:javascript
运行
复制
Nullable<int> nulInt;

开放泛型类型是在运行时确定一个或多个泛型类型的类型(因此,Nullable<T>类是一个示例)。

票数 12
EN

Stack Overflow用户

发布于 2013-07-18 21:52:32

  1. 第一个答案是关于方法参数的。
  2. 第二个是泛型类型参数。

这就是你错过的。

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

"in .NET“每种类型在运行时第一次使用时都有一个初始化阶段。(请参见静态字段和静态构造函数)

so:在运行时初始化所有类型,但使用静态类型(或动态类型.)在编译时,它们需要“解决”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17734247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档