Diferenças entre modelos C++ e genéricos C# (Guia de Programação em C#)
Os modelos C++ e genéricos C# são recursos de linguagem que fornecem o suporte aos tipos parametrizados. No entanto, há várias diferenças entre os dois. No nível de sintaxe, os genéricos C# são uma abordagem mais simples para os tipos parametrizados sem a complexidade de modelos C++. Além disso, o C# não tenta fornecer toda a funcionalidade que os modelos C++ fornecem. No nível da implementação, a principal diferença é que as substituições do tipo genérico do C# são realizadas em runtime e as informações do tipo genérico são preservadas para objetos instanciados. Para obter mais informações, confira Genéricos no runtime.
A seguir estão as principais diferenças entre modelos C++ e genéricos C#:
Os genéricos C# não oferecem a mesma flexibilidade que os modelos C++. Por exemplo, não é possível chamar os operadores aritméticos em uma classe genérica C#, embora seja possível chamar operadores definidos pelo usuário.
O C# não permite parâmetros de modelo sem tipo, como
template C<int i> {}
.O C# não dá suporte à especialização explícita ou seja, uma implementação personalizada de um modelo para um tipo específico.
O C# não dá suporte à especialização parcial: uma implementação personalizada para um subconjunto dos argumentos de tipo.
O C# não permite que o parâmetro de tipo a ser usado como a classe base para o tipo genérico.
O C# não permite que os parâmetros de tipo tenham tipos padrão.
No C#, um parâmetro de tipo genérico não pode ser genérico, embora os tipos construídos possam ser usados como genéricos. O C++ permite parâmetros de modelo.
O C++ permite o código que pode não ser válido para todos os parâmetros de tipo no modelo, que é então verificado para o tipo específico usado como o parâmetro de tipo. O C# requer código em uma classe a ser gravada de forma que ele funcionará com qualquer tipo que satisfaça as restrições. Por exemplo, em C++ é possível escrever uma função que usa os operadores aritméticos
+
e-
em objetos do parâmetro de tipo, que produzirá um erro no momento da instanciação do modelo com um tipo que não dá suporte a esses operadores. O C# não permite isso. Os únicos constructos da linguagem permitidos são os que podem ser deduzidos das restrições.