Diferenças entre modelos C++ e genéricos C# (Guia de programação em C#)
Os modelos C# Generics e C++ são recursos de linguagem que fornecem suporte para tipos parametrizados. No entanto, existem muitas diferenças entre os dois. No nível de sintaxe, os genéricos C# são uma abordagem mais simples para tipos parametrizados sem a complexidade dos modelos C++. Além disso, o C# não tenta fornecer todas as funcionalidades que os modelos C++ fornecem. No nível de implementação, a principal diferença é que as substituições de tipo genérico C# são executadas em tempo de execução e, portanto, as informações de tipo genérico são preservadas para objetos instanciados. Para obter mais informações, consulte Genéricos no tempo de execução.
A seguir estão as principais diferenças entre os modelos C# Generics e C++:
Os genéricos C# não fornecem a mesma quantidade de flexibilidade que os modelos C++. Por exemplo, não é possível chamar operadores aritméticos em uma classe genérica C#, embora seja possível chamar operadores definidos pelo usuário.
C# não permite parâmetros de modelo não-tipo, como
template C<int i> {}
.C# não suporta especialização explícita; ou seja, uma implementação personalizada de um modelo para um tipo específico.
C# não suporta especialização parcial: uma implementação personalizada para um subconjunto dos argumentos de tipo.
C# não permite que o parâmetro type seja 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.
Em C#, um parâmetro de tipo genérico não pode ser um genérico, embora os tipos construídos possam ser usados como genéricos. C++ permite parâmetros de modelo.
C++ permite 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 type. C# requer que o código em uma classe seja escrito de tal forma que ele funcione 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 type, o que produzirá um erro no momento da instanciação do modelo com um tipo que não suporta esses operadores. C# não permite isso; As únicas construções de linguagem permitidas são aquelas que podem ser deduzidas das restrições.