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

Недавно я обнаружил, что индексатор может принимать массив аргументов как 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 индексатор?

1 ответ

Решение

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

Согласно MSDN,

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

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

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

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

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

Другие вопросы по тегам