【问题标题】:Practical usage of params indexerparams indexer的实际使用
【发布时间】:2015-12-08 09:04:29
【问题描述】:

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

【问题讨论】:

  • 我不得不承认:这是 params 关键字的一个非常时髦的用例。
  • 索引器只是应用于普通方法的语法糖(强制它具有至少一个参数)。由于普通方法采用 formal-parameter-list(在 C# 语言规范的第 10.6.1 节中定义)并且 formal-parameter-list 可能包含 parameter-array,这意味着您可以将params与索引器一起使用。

标签: c# parameter-passing variadic indexer params-keyword


【解决方案1】:

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

根据MSDN

索引器不必由整数值索引;如何定义具体的查找机制由您决定。

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

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

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

或任何其他不寻常的类型或集合,包括 params 数组,如果它看起来方便且适合您的情况。

【讨论】:

  • 我猜由于索引器被翻译成 IL 中的方法,因此您可以使用 params 关键字也就不足为奇了。但是,方法有一个区别 - 虽然您可以调用完全省略参数的方法(然后参数数组“自动”实例化为空数组),但您不能在没有任何参数的情况下调用索引器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2011-10-01
相关资源
最近更新 更多