Практическое использование индексатора параметров
Недавно я обнаружил, что индексатор может принимать массив аргументов как 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
массив, если он кажется удобным и подходящим в вашем случае.