以下代码片段摘自Programming C# 5.0 的示例 10-11(第 343 页):
public static T[] Select<T>(this CultureInfo[] cultures,
Func<CultureInfo, T> map)
{
var result = new T[cultures.Length];
for (int i = 0; i < cultures.Length; ++i)
{
result[i] = map(cultures[i]);
}
return result;
}
我无法弄清楚如何在不通过对 T
应用约束来公开任何信息的情况下编译它。具体来说,如果 T
可能不是引用类型,而是值类型(即 struct
),编译器如何知道要为数组分配多少字节?此外,赋值操作 result[i] = map(cultures[i])
的语义似乎取决于 T
是引用类型还是值类型。
最佳答案
CultureInfo
之间没有依赖关系和 T
任何。全部T
的同样有效,因为您使用自定义 Func<CultureInfo, T>
处理“转换” .
我认为您对泛型在 C# 中的工作方式感到困惑。它们不是编译时特性(就像在 Java 中一样),它们一直存在到运行时。只有当您真正需要具体化的泛型类型时,才会编译该类型,到那时它已经知道是什么 T
是。
这当然是C#没有Java的List<?>
的原因之一。 .没有“通用泛型类型”,你只是在“延迟”类型的具体化——一旦你有了 List<string>
和 List<int>
,这两者是完全不同的类型,只有反射才能告诉您它们来自相同的泛型类型。
关于c# - 为什么要在不约束 T 的情况下编译通用代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36602722/