params索引器的实际用途

5

最近,我发现索引器可以接受参数数组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索引器的实际用途是什么?


3
我必须承认:对于 params 关键字来说,那是一个相当时髦的用法。 - Kirill Shlenskiy
索引器只是应用于普通方法的语法糖(并强制要求它至少有一个参数)。由于普通方法需要一个形式参数列表(在C#语言规范的10.6.1节中定义),而形式参数列表可以包含一个参数数组,这意味着您可以在索引器中使用params - Matthew Watson
1个回答

1

发布问题并查看代码和文档后,一分钟内找到了答案 - C#允许您将任何类型作为索引器的参数,但不允许 params 作为特例。

根据 MSDN

索引器不一定要由整数值进行索引;您可以自行定义具体的查找机制。

换句话说,索引器可以是任何类型。它可以是一个数组……

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

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

或者包括params数组在内的任何其他不寻常类型或集合,如果在您的情况下看起来方便和合适,请使用。

1
我猜想由于索引器在IL中被转换为方法,所以你可以使用 params 关键字并不意外。但是与方法有一个区别-虽然你可以完全省略参数调用方法(参数数组将自动初始化为空数组),但是你不能调用没有任何参数的索引器。 - Grx70

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接