C++ テンプレートと C# ジェネリックの違い (C# プログラミング ガイド)
更新 : 2007 年 11 月
C# ジェネリックも C++ テンプレートもいずれもパラメータ化された型のサポートを提供する言語機能です。ただし、これら 2 つにはさまざまな違いがあります。たとえば、構文レベルでは、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# では、このような関数は許可されません。許可される言語構成要素は、制約から推定できるものだけに限られます。