【发布时间】:2013-07-18 00:57:48
【问题描述】:
根据thisstackoverflow 的回答,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>
{
}
【问题讨论】:
-
您链接到的那两个帖子实际上是在描述不同的概念。
-
您提供的链接中发布的答案中有哪些部分您不明白
No; that's fundamentally impossible. The whole point of generics is that they create compile-time types. You're trying to create a type which is unknown at compile time. You can do it using reflection, though. (typeof(MyClass<>).MakeGenericType(myType)) -
那么你需要清楚地定义一个类型被“解析”的含义,因为显然至少有两个人用它来表示至少两个不同的东西。我不知道“已解决”类型的特征是什么。我知道重载分辨率的特点;这就是您所说的“已解决”的类型吗?
-
您更新后的问题的答案是否。直到 runtime 才创建构造的泛型类型。在编译时,编译器将确定
int是对应于T的合法参数,仅此而已。此外:Test<T>的主体必须包含可以在给定T的任何 可能值的情况下编译的代码,而不仅仅是出现在Main中的值。这是泛型和模板之间的主要区别之一。