gpt4 book ai didi

c# - 什么时候在 C# 中解析泛型类型?

转载 作者:可可西里 更新时间:2023-11-01 07:50:28 26 4
gpt4 key购买 nike

根据 this在 stackoverflow 上回答,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>
{
}

最佳答案

问题是这个问题不是很好。两个人声称相反的事情:类型在运行时“解析”,类型在编译时“解析”。

由于它们相互矛盾,因此“已解决”的意思一定不同。

我不知道“解析”类型是什么意思。不过,我确实知道什么是过载解决方案。当被要求解决不涉及 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 .

如果这不是您所说的“已解决”的意思,请澄清问题。

关于c# - 什么时候在 C# 中解析泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17734247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com