Почему не возможно определить универсальные индексаторы в.NET?

AWS Config Правила позволяют применять это требование с помощью управляемого правила AWS, называемого required-tags . Поскольку это управляемое правило, вам не нужно создавать функцию lamdba.

45
задан Cœur 16 March 2017 в 16:32
поделиться

5 ответов

Единственная вещь я могу думать об этом, может использоваться, что-то вдоль этих строк:

var settings = ConfigurationSection.AppSettings;
var connectionString = settings<string>["connectionString"];
var timeout = settings<int>["timeout"];

, Но это на самом деле не покупает Вас ничто. Вы только что заменили круглые круглые скобки (в качестве в (int)settings["timeout"]) с угловыми скобками, но не получили дополнительной безопасности типов, как можно свободно сделать

var timeout = settings<int>["connectionString"];

, Если у Вас есть что-то, что это сильно, но не со статическим контролем типов, Вы могли бы хотеть ожидать до C# 4.0 с динамичный ключевое слово.

1
ответ дан Community 26 November 2019 в 21:18
поделиться

Свойства не могут быть универсальными в C#2.0/3.0 поэтому, у Вас не может быть универсального индексатора.

18
ответ дан Kev 26 November 2019 в 21:18
поделиться

Я не знаю, почему, но индексаторы просто синтаксический сахар. Запишите общий метод вместо этого, и Вы получите ту же функциональность. Например:

   public T GetItem<T>(string key)
   {
      /* Return generic type T. */
   }
17
ответ дан davogones 26 November 2019 в 21:18
поделиться

Вы можете; просто отбросьте эти <T> часть от Вашего объявления, и это будет хорошо работать. т.е.

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

(Принятие Вашего класса универсально с параметром типа, названным T).

11
ответ дан Greg Beech 26 November 2019 в 21:18
поделиться

Вот место, где это было бы полезно. Скажем, у вас есть настоятельно набранный дополнительный ключ для объявления опций.

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

Там, где варианты выставляются через интерфейс IOPTIONS :

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);
}

код может затем использовать универсальный индексатор как приятные сильно напечатанные параметры магазина:

void Foo()
{
    IOptions o = ...;
    o[DefaultOptions.SomeBooleanOption] = true;
    int integerValue = o[DefaultOptions.SomeIntegerOption];
}
28
ответ дан 26 November 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: