C # générique à constante

Existe-t-il quelque chose de similaire à ce modèle C ++?

template  class B { int f() { return A; } } 

Je veux que chaque instance de B , B , etc. (par exemple un tuple) soit d’un type différent.

La réponse courte est non .

Cela ne correspond pas à la manière dont fonctionnent les génériques C #, comme dans les modèles C ++.

Les génériques .net ne sont pas une fonctionnalité linguistique, ils sont une fonctionnalité d’exécution. Le moteur d’exécution sait comment instancier des génériques à partir d’un bytecode générique spécial, qui est plutôt restreint par rapport à ce que les modèles C ++ peuvent décrire.

Comparez cela avec les modèles C ++, qui instancient fondamentalement l’intégralité de l’AST de la classe à l’aide de types substitués. Il serait possible d’append une instanciation basée sur AST à l’exécution, mais ce serait certainement beaucoup plus complexe que les génériques actuels.

Sans fonctionnalités telles que les tableaux de type valeur (qui n’existent que dans du code peu sûr), l’instanciation récursive de modèles ou la spécialisation de modèles utilisant de tels parameters ne serait pas non plus très utile.

C # ne prend pas en charge les parameters génériques non typés comme C ++.

Les génériques C # sont beaucoup plus simples et moins performants que les modèles C ++. MSDN a une liste succincte de différences entre les modèles C ++ et les génériques C # .

Une solution de contournement à cette limitation consiste à définir une classe qui expose elle-même la valeur littérale qui vous intéresse. Par exemple:

 public interface ILiteralInteger { int Literal { get; } } public class LiteralInt10 : ILiteralInteger { public int Literal { get { return 10; } } } public class MyTemplateClass< L > where L: ILiteralInteger, new( ) { private static ILiteralInteger MaxRows = new L( ); public void SomeFunc( ) { // use the literal value as required if( MaxRows.Literal ) ... } } 

Usage:

 var myObject = new MyTemplateClass< LiteralInt10 >( ); 

Les génériques C # sont spécialisés au moment de l’exécution, alors que les modèles C ++ sont traités au moment de la compilation pour créer un type entièrement nouveau. Compte tenu de cela, le moteur d’exécution ne dispose tout simplement pas des fonctionnalités permettant de traiter des parameters non typés (il ne s’agit pas uniquement d’un problème C #).