2015-12-08 5 views
5

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

+2

Должен признать: это довольно забавный случай использования ключевого слова 'params'. –

+0

Индексатор - это просто синтаксический сахар, применяемый к нормальному методу (с принудительным исполнением, что он имеет хотя бы один параметр). Поскольку нормальный метод принимает * формальный параметр-список * (определенный в разделе 10.6.1 спецификации языка C#), а * format-parameter-list * может содержать * parameter-array *, это означает, что вы можете использовать ' 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 массив, если это, кажется, удобно и подходит в вашем случае.

+0

Я предполагаю, что, поскольку индексы переводятся в методы в ИЛ, неудивительно, что вы можете облегчить ключевое слово 'params'. Однако есть одно отличие от методов - хотя вы можете вызывать метод, полностью опускающий аргументы (тогда массив параметров автоматически автоамагически создается как пустой массив), вы не можете вызвать индексатор без каких-либо аргументов. – Grx70