83

私は(とりわけ)この質問で、人々がKeyValuePairのインスタンスを初期化する方法を疑問に思っているのを見てきました。

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>
{ 
  Key = 1,
  Value = 2
};

プロパティが存在しないかのように機能しません。代わりに、このようなコンストラクターを使用する必要があります。

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);

確かに短い構文ですが、初期化子を使用できないことが気になります。私は何を間違っていますか?

4

9 に答える 9

81

を使用してkeyValuePairを初期化する必要があるのは間違いではありません

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);

オブジェクトの初期化構文、つまり { Key = 1, Value = 2 } を使用できない理由は、Key プロパティと Value プロパティに getter のみの setter がない (読み取り専用である) ためです。したがって、次のこともできません。

keyValuePair.Value = 1; // not allowed
于 2013-03-19T09:08:16.547 に答える
16

KeyValuePair<int, int>は構造体であり、幸いにも不変の構造体です。特に、これはそのプロパティが読み取り専用であることを意味します。したがって、オブジェクト初期化子を使用することはできません。

于 2013-03-19T09:06:12.303 に答える
14

わかりました。答えがあります。Tuple別の方法として、型推論の魔法のために、クラスに似たファクトリーパターンを好みます:)

public static class KeyValuePair
{
    public static KeyValuePair<K, V> Create<K, V>(K key, V value)
    {
        return new KeyValuePair<K, V>(key, value);
    }
}

短いので短くなります:

var keyValuePair = KeyValuePair.Create(1, 2);
于 2013-06-12T20:48:08.810 に答える
7

ここに仕事をする例があります

KeyValuePair<int, int> kvp = new KeyValuePair<int, int>(1, 1);
于 2015-06-05T20:06:21.160 に答える
5

Key プロパティと Value プロパティにはセッターがありません。そのため、初期化子でそれらを使用することはできません。コンストラクタ :) を使用するだけで問題ありません。

于 2013-03-19T09:08:43.557 に答える
1

あなたは何か間違ったことをしていません。KeyValuePairs プロパティは読み取り専用です。設定できません。さらに、空のデフォルト コンストラクターはありません。提供されているコンストラクターを使用する必要があります。

于 2013-03-19T09:06:52.593 に答える
1

KeyプロパティとValueプロパティは読み取り専用であるため、オブジェクト初期化子では使用できません。

C# プログラミング ガイドのこのエントリを参照してください。

于 2013-03-19T09:06:06.410 に答える