Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# params索引器的实际应用_C#_Parameter Passing_Variadic_Indexer_Params Keyword - Fatal编程技术网

C# params索引器的实际应用

C# params索引器的实际应用,c#,parameter-passing,variadic,indexer,params-keyword,C#,Parameter Passing,Variadic,Indexer,Params Keyword,最近,我发现indexer可以接受参数数组作为params: public class SuperDictionary<TKey, TValue> { public Dictionary<TKey, TValue> Dict { get; } = new Dictionary<TKey, TValue>(); public IEnumerable<TValue> this[params TKey[] keys] {

最近,我发现indexer可以接受参数数组作为
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]); }
    }
}
公共类超级字典
{
公共字典Dict{get;}=new Dictionary();
public IEnumerable this[params TKey[]keys]
{
获取{返回键。选择(键=>Dict[key]);}
}
}
然后,您将能够执行以下操作:

var sd = new SuperDictionary<string, object>();
/* Add values */
var res = sd["a", "b"];
var sd=new SuperDictionary();
/*增加价值*/
var res=sd[“a”,“b”];

然而,我从未在.NETFramework或任何第三方库中遇到过这种用法。为什么要实施?能够引入
params
indexer的实际用途是什么?

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

根据,

索引器不必按整数值编制索引;如何定义特定的查找机制取决于您

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

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

var res = sd[new [] {"a", "b"}];
public IEnumerable此[TKey[]键]
{
获取{返回键。选择(键=>Dict[key]);}
}
var res=sd[new[]{“a”,“b”}];

或者任何一种不寻常的类型或集合,包括
params
array,如果它看起来对您的情况方便且合适的话。

我必须承认:对于
params
关键字来说,这是一个非常时髦的用例。索引器只是应用于普通方法的语法糖分(强制要求它至少有一个参数)。因为普通方法采用正式的参数列表(定义见C语言规范第10.6.1节)一个正式的参数列表可能包含一个参数数组,这意味着您可以将
params
与索引器一起使用。我想,由于索引器在IL中被转换为方法,所以您可以方便地使用
params
关键字也就不足为奇了。不过,方法有一个不同之处——尽管您可以调用一个完全忽略a的方法rguments(参数数组被“自动”实例化为空数组),您不能在没有任何参数的情况下调用索引器。