57 votes

Pourquoi il n'est pas possible de définir générique indexeurs dans .NET?

Personne ne sait pourquoi vous ne pouvez pas créer un générique de l'indexeur dans .NET

le code suivant renvoie une erreur de compilateur:

   public T this<T>[string key]
   {
      get { /* Return generic type T. */ }
   }

Est-ce à dire que vous ne pouvez pas créer un générique de l'indexeur pour un générique membre de collection?

39voto

280Z28 Points 49515

Voici un endroit où cela serait utile. Disons que vous avez un fortement typées OptionKey<T> pour déclarer des options.

public static class DefaultOptions
{
    public static OptionKey<bool> SomeBooleanOption { get; }
    public static OptionKey<int> SomeIntegerOption { get; }
}

Lorsque des options sont exposés par l' IOptions interface:

public interface IOptions
{
    /* since options have a default value that can be returned if nothing's
     * been set for the key, it'd be nice to use the property instead of the
     * pair of methods.
     */
    T this<T>[OptionKey<T> key]
    {
        get;
        set;
    }

    T GetOptionValue<T>(OptionKey<T> key);
    void SetOptionValue<T>(OptionKey<T> key, T value);
}

Le Code peut ensuite utiliser le générique de l'indexeur comme une belle fortement typées options magasin:

void Foo()
{
    IOptions o = ...;
    o[DefaultOptions.SomeBooleanOption] = true;
    int integerValue = o[DefaultOptions.SomeIntegerOption];
}

19voto

davogones Points 5405

Je ne sais pas pourquoi, mais les indexeurs sont juste sucre syntaxique. Écrire une méthode générique à la place et vous obtiendrez les mêmes fonctionnalités. Par exemple:

   public T GetItem<T>(string key)
   {
      /* Return generic type T. */
   }

17voto

Kev Points 60744

Les propriétés ne peuvent pas être générique en C#2.0/3.0 si, par conséquent, vous ne pouvez pas avoir un générique de l'indexeur.

8voto

Greg Beech Points 55270

Vous le pouvez, il suffit de déposer l' <T> d'une partie de votre déclaration et il fonctionne parfaitement. c'est à dire

public T this[string key]
{
   get { /* Return generic type T. */ }
}

(En supposant que votre classe est générique avec un paramètre de type nommé T).

3voto

CodeMangler Points 701

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