如果我有这样的类(class):-

static class Foo {
   public static void Bar<T>(T item) { Console.WriteLine(item.ToString(); }
}

我知道在这个例子中没有必要使用 T 因为所有类型都有 ToString() 等等 - 这只是一个人为的例子。我更感兴趣的是引擎盖下会发生以下情况:-
Foo.Bar("Hello");
Foo.Bar(123);
Foo.Bar(new Employee("Isaac"));

我广泛地(认为!)我理解具体化,即如果您制作不同类型的通用类,例如
List<Int32>
List<String>
List<Employee>

等等,然后在编译时(或运行时?)我们最终得到三个实际的具体类型,一个用于指定的每个泛型参数。这是否同样适用于我的第一个示例中的方法调用,即我们是否仍然只有一个类 Foo 但有三个具体化的 Bar 方法,一个用于 String、Int32 和 Employee?

最佳答案

这就是 C++ 模板和 C# 泛型之间的区别发挥作用的地方。

在 C++ 中,模板会为使用它的每种类型生成一个新方法。但是,在 C# 中,方法中的代码只创建一次。无论您使用 intstring 还是 object 类型参数调用它,都会运行相同的代码。

由于 C# 泛型在编译时保持通用,因此它们可以在编译库中公开,而无需重新编译。在 C++ 中,您需要在使用代码中包含原始模板,以便可以编译新的副本。

简单地说, 每个泛型方法只能得到一个编译方法。

关于c# - 非泛型类上的 C# 泛型方法归结为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13824570/

10-16 19:24
查看更多