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