Практическое использование индексатора params

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

public class SuperDictionary<TKey, TValue>
{
    public Dictionary<TKey, TValue> Dict { get; } = new Dictionary<TKey, TValue>();

    public IEnumerable<TValue> this[params TKey[] keys]
    {
        get { return keys.Select(key => Dict[key]); }
    }
}

Затем вы сможете сделать:

var sd = new SuperDictionary<string, object>();
/* Add values */
var res = sd["a", "b"];

Однако я никогда не встречал такого использования в .NET Framework или каких-либо сторонних библиотеках. Почему это реализовано? Какова практическая польза от возможности ввести индексатор params?


person Yeldar Kurmangaliyev    schedule 08.12.2015    source источник
comment
Должен признать: это довольно странный вариант использования ключевого слова params.   -  person Kirill Shlenskiy    schedule 08.12.2015
comment
Индексатор — это просто синтаксический сахар, примененный к обычному методу (с условием, что он имеет хотя бы один параметр). Поскольку обычный метод принимает список формальных параметров (определено в разделе 10.6.1 спецификации языка C#), а список формальных параметров может включать массив параметров, это означает, что вы можете использовать params с индексатором.   -  person Matthew Watson    schedule 08.12.2015


Ответы (1)


Ответ был найден через минуту после публикации вопроса и просмотра кода и документации - C# позволяет использовать любой тип в качестве параметра для индексатора, но не params как частный случай.

Согласно MSDN,

Индексаторы не обязательно должны быть проиндексированы целочисленным значением; вам решать, как определить конкретный механизм поиска.

Другими словами, индексатор может быть любого типа. Это может быть массив...

public IEnumerable<TValue> this[TKey[] keys]
{
    get { return keys.Select(key => Dict[key]); }
}

var res = sd[new [] {"a", "b"}];

или любой другой необычный тип или набор, включая массив params, если это кажется удобным и подходящим в вашем случае.

person Yeldar Kurmangaliyev    schedule 08.12.2015
comment
Я предполагаю, что, поскольку индексаторы переведены в методы в IL, неудивительно, что вы можете упростить ключевое слово params. Однако есть одно отличие от методов: хотя вы можете вызвать метод, полностью опуская аргументы (массив параметров затем автоматически создается как пустой массив), вы не можете вызвать индексатор без каких-либо аргументов. - person Grx70; 08.12.2015