2015-12-08 42 views
5

的实际使用,我最近发现,索引可以接受的参数数组作为paramsPARAMS索引

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

索引器只是应用于常规方法的语法糖(强制它至少有一个参数)。由于常规方法需要*形式参数列表*(在C#语言规范的第10.6.1节中定义),并且*形式参数列表*可能包含*参数数组*,这意味着您可以使用' 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

我想,因为索引器被翻译成IL中的方法,所以你可以使用'params'关键字并不奇怪。尽管你可以调用一个完全忽略参数的方法(参数数组然后“自动地”实例化为一个空数组),但是不能在没有任何参数的情况下调用索引器。 – Grx70