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インデクサーを導入できることの実際の使用法は何ですか?

4

1 に答える 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または、あなたの場合に便利で適切であると思われる場合は、配列を含む任意の種類の別の珍しい型またはコレクション。

于 2015-12-08T09:11:10.777 に答える