4 votes

Pourquoi utiliser "where T : struct" pour les méthodes d'extension d'enum génériques en C# ?

J'ai vu des exemples de méthodes d'extension génériques en C# pour les énumérations qui utilisent les éléments suivants where T: struct et un autre qui utilise where T: IComparable . Par exemple, dans le premier cas :

public static class EnumExtensionMethods
{
  public static string Description<T>(this T enumValue) where T : struct
  {
    // ...
  }
}

Je ne comprends pas pourquoi la contrainte exige que ce type T doit être un struct . Je m'attendrais à ce que ce soit where T : Enum . Quelqu'un peut-il m'expliquer cela ? En bonus, peut-être aussi expliquer pourquoi IComparable est également utilisé dans certains exemples.

Pour info, j'ai fait des recherches sur ce sujet. Je peux trouver des explications sur pourquoi IComparable est utilisé, par exemple dans cette question mais cela ne semble pas concluant, et ils n'expliquent pas pourquoi struct est utilisé en conjonction.

18voto

Jon Skeet Points 692016

Je soupçonne que vous regardez du code écrit avant C# 7.3 - la possibilité de contraindre un paramètre de type générique à l'aide de la fonction Enum o Delegate n'a été introduit qu'en C# 7.3.

Mais pour les méthodes d'extension ciblant les enums, il faudrait les deux Enum y struct dans la contrainte, par exemple

public static string GetDescription<T>(this T enumValue) where T : struct, Enum
{
    // ...
}

De cette façon, il ne peut être appelé que sur béton des types d'énumération, plutôt que GetDescription<Enum>(null) .

1voto

germi Points 3423

La possibilité de contraindre une méthode à Enum est relativement nouveau en C#. Utilisation de struct était un moyen d'empêcher au moins l'utilisation de types de référence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X