15

次のように定義されたアクション辞書があります。

var actions = new Dictionary<string, Action<string, string>>();

私はそこに次のようなアクションを入れました:

actions.Add("default", (value, key) => result.Compare(value, properties[key], Comparers.SomeComparer, key));
...

このコードを使用して実行しています:

if (actions.ContainsKey(pair.Key))
{
    actions[pair.Key](pair.Value, pair.Key);
}
else
{
    actions[""](pair.Value, pair.Key);
}

問題なく動作しますが、「?」を使用したかったのです。短くするための表記:

actions.ContainsKey(pair.Key) ? actions[pair.Key](pair.Value, pair.Key) : actions[""](pair.Value, pair.Key);

このコードは私にエラーを示しています:

エラー 1 ステートメントとして使用できるのは代入、呼び出し、インクリメント、デクリメント、および新しいオブジェクト式のみです

actions[pair.Key](pair.Value, pair.Key) 電話じゃないの?何か不足していますか?「?」は使用できますか? アクション辞書で表記?私はそれについて何かを見つけようとしていましたが、「?」について何かを見つけるのは難しいです. '?' のため、演算子とこのエラー グーグルには無視されます。

4

5 に答える 5

20

代わりにこれを試してください:

actions[actions.ContainsKey(pair.Key) ? pair.key : ""](pair.Value, pair.Key);

これで問題が解決します。

于 2013-08-20T06:40:28.113 に答える
13

?:条件演算子は次のように定義されます。

条件演算子 (?:)は、ブール式の値に応じて2 つの値のいずれかを返します。

あなたのアクションは値を返さないので、戻り値は何を?:意味するのでしょうか?

于 2013-08-20T06:40:35.677 に答える
6

あなたの電話自体には何の問題もありません。表現actions[pair.Key](pair.Value, pair.Key)は確かに呼び出しです。ただし、それはコンパイラが不満を言っている式ではありません。コンパイラは、代入、呼び出し、インクリメント、デクリメント、新しいオブジェクト式のいずれでもない条件演算子式全体を参照しているため、それ自体をステートメントにすることはできません。

代替手段は次のとおりです。

  • 式の結果を別の変数に代入し、条件式をより大きな代入文の単なる部分式にする
  • 条件式をインデックス式に因数分解するため、ステートメント全体が 2 つの個別の呼び出しではなく、1 つの呼び出しになります。
  • 2 つの独立したステートメントを使用して、使用するキーを決定し、関数を呼び出します。

    var key = actions.ContainsKey(pair.Key) ? pair.Key : "";
    actions[key](pair.Value, pair.Key);
    

    コードの重複は避けられますが、すべてを 1 つの複雑なステートメントにまとめようとしないため、読みやすくなります。

于 2013-08-20T06:56:27.020 に答える