C# 泛型和C++模板都是支持参数化类型的语言功能。 但是,这两者之间存在许多差异。 在语法级别,C# 泛型是参数化类型的更简单方法,无需C++模板的复杂性。 此外,C# 不会尝试提供C++模板提供的所有功能。 在实现级别,主要区别在于 C# 泛型类型替换在运行时执行,因此为实例化对象保留泛型类型信息。 有关详细信息,请参阅 运行时中的泛型。
以下是 C# 泛型和C++模板之间的主要区别:
C# 泛型不提供与C++模板相同的灵活性。 例如,不能在 C# 泛型类中调用算术运算符,尽管可以调用用户定义的运算符。
C# 不允许使用非类型模板参数,例如
template C<int i> {}
。C# 不支持显式专用化;即特定类型的模板的自定义实现。
C# 不支持部分专用化:类型参数子集的自定义实现。
C# 不允许将类型参数用作泛型类型的基类。
C# 不允许类型参数具有默认类型。
在 C# 中,泛型类型参数本身不能是泛型,尽管构造的类型可用作泛型。 C++允许模板参数。
C++允许代码可能对模板的某些类型参数无效,并会对所使用的特定类型参数进行检查。 C# 要求以某种方式编写类中的代码,以便处理满足约束的任何类型。 例如,在C++中,可以编写一个函数,该函数对类型参数的对象使用算术运算符
+
和-
,如果类型不支持这些运算符,则会在模板实例化时产生错误。 C# 不允许这样做;允许的唯一语言构造是从约束中推断出来的。