c# - 为什么要在不约束 T 的情况下编译通用代码?

标签 c# generics

以下代码片段摘自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/

相关文章:

java - 无法解决 REST API 中的一般错误

generics - 在 Swift 泛型类型的 where 子句中访问自定义协议(protocol)的关联类型

generics - 一种处理嵌入一个通用结构的所有结构类型的方法(json 编码)

c# - 如何使用 C# 舍入到最接近的 .5

c# - 如何使用 Asp.Net MVC C# 创建 CMS 应用程序

c# - 获取 TextBox 中的文本行数

java - 如何在Stack数据结构中使用泛型?

c# - 泛型的默认值

c# - 如何在 Windows 窗体的任务栏上最大化应用程序?

c# - 如何在 c#.net 中获取 HP Scanner 5590 Flatbed 的状态?