Je tiens à différencier les cas suivants:
- Un simple type de valeur (par exemple,
int
) - Nullable type de valeur (par exemple,
int?
) - Un type de référence (par exemple,
string
) - en option, je ne voudrais pas de soins si ce mappée (1) ou (2) ci-dessus
J'ai le code suivant qui fonctionne très bien pour les cas (1) et (2):
static void Foo<T>(T a) where T : struct { } // 1
static void Foo<T>(T? a) where T : struct { } // 2
Cependant, si j'essaie de détecter les cas (3), comme cela, il ne compile pas:
static void Foo<T>(T a) where T : class { } // 3
Le message d'erreur est du Type 'X' définit déjà un membre appelé 'Foo' avec les mêmes types de paramètres. Eh bien, de toute façon je ne peut pas faire la différence entre where T : struct
et where T : class
.
Si je retire la troisième fonction (3), le code suivant ne compile pas, soit:
int x = 1;
int? y = 2;
string z = "a";
Foo (x); // OK, calls (1)
Foo (y); // OK, calls (2)
Foo (z); // error: the type 'string' must be a non-nullable value type ...
Comment puis-je obtenir de l' Foo(z)
de compiler, de la cartographie à l'une des fonctions ci-dessus (ou à un tiers avec une autre contrainte, que je n'ai pas pensé)?