C# 泛型和 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# 不允許這樣;唯一允許的語言構造是那些可從約束推導出來的構造。