但是,两者之间存在很多不同。 在语法层次,C# 泛型是参数化类型的一个更简单的方法,而不具有 C++ 模板的复杂性。 此外,C# 不试图提供 C++ 模板所具有的所有功能。 在实现层次,主要区别在于 C# 泛型类型的替换在运行时执行,从而为实例化对象保留了泛型类型信息。 有关详细信息,请参阅运行时中的泛型。
C# 泛型的灵活性与 C++ 模板不同。 例如,虽然可以调用 C# 泛型类中的用户定义的运算符,但是无法调用算术运算符。
C# 不允许使用非类型模板参数,如 template C。
C# 不支持显式定制化;即特定类型模板的自定义实现。
C# 不支持部分定制化:部分类型参数的自定义实现。
C# 不允许将类型参数用作泛型类型的基类。
C# 不允许类型参数具有默认类型。
在 C# 中,泛型类型参数本身不能是泛型,但是构造类型可以用作泛型。 C++ 允许使用模板参数。
C++ 允许在模板中使用可能并非对所有类型参数有效的代码,随后针对用作类型参数的特定类型检查此代码。 C# 要求类中编写的代码可处理满足约束的任何类型。 例如,在 C++ 中可以编写一个函数,此函数对类型参数的对象使用算术运算符 + 和 -,在实例化具有不支持这些运算符的类型的模板时,此函数将产生错误。 C# 不允许此操作;唯一允许的语言构造是可以从约束中推断出来的构造。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace GenericTemplateDemo
- {
- class CompareUtil
- {
- ///
- /// 比较两个数的大小
- ///
- ///
一种类型,实现IComparable接口 - /// 第一个数
- /// 第二个数
- public static void CompareValue<T>(T first, T second) where T : IComparable
- {
- if (first == null && second == null)
- {
- Console.WriteLine($"【{first}】与【{second}】相等,都为null");
- }
- else if (first == null || second == null)
- {
- Console.WriteLine($"存在【{first}】,【{second}】某一个为null,比较无意义");
- }
- else if (first.CompareTo(second) > 0)
- {
- Console.WriteLine($"【{first}】大于【{second}】");
- }
- else if (first.CompareTo(second) == 0)
- {
- Console.WriteLine($"【{first}】与【{second}】相等");
- }
- else
- {
- Console.WriteLine($"【{first}】小于【{second}】");
- }
- }
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- CompareUtil.CompareValue(8.8, 20);
- CompareUtil.CompareValue("ABCD月清疏", "ABCD白沫晴");
- Console.ReadLine();
- }
- }

- template<typename T>
- void exchange(T& left, T& right)
- {
- T temp = left;
- left = right;
- right = temp;
- }
我们发现 template关键字只出现在C++中,用于标记模板,template在C#中不是关键字。
C#中<>可以嵌套,比如List