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 只有赋值、调用、递增、递减和new对象表达式可以作为语句使用

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

?:条件运算符定义为:

条件运算符 (?:)根据布尔表达式的值返回两个值之一

您的操作没有返回值,那么返回值是什么?:意思?

于 2013-08-20T06:40:35.677 回答
7

如果你真的必须这样做,你可以试试

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

澄清一下,来自:运算符(C# 参考)

条件必须评估为真或假。如果条件为真,则计算 first_expression 并成为结果。如果条件为假,则计算 second_expression 并成为结果。仅计算两个表达式中的一个。

这是等价的

int input = Convert.ToInt32(Console.ReadLine());
string classify;

// if-else construction.
if (input < 0)
    classify = "negative";
else
    classify = "positive";

// ?: conditional operator.
classify = (input < 0) ? "negative" : "positive";
于 2013-08-20T06:40:56.900 回答
6

你的电话本身没有问题。表情actions[pair.Key](pair.Value, pair.Key)确实是一种召唤。不过,这不是编译器抱怨的表达式。编译器指的是整个条件运算符表达式,它既不是赋值、调用、递增、递减,也不是新的对象表达式,因此不允许单独作为语句。

替代方案包括:

  • 将表达式的结果分配给另一个变量,使条件仅是较大赋值语句的子表达式
  • 将条件分解到索引表达式中,因此整个语句是一个调用而不是两个单独的调用。
  • 使用两个独立的语句来决定使用哪个键,然后调用函数:

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

    它仍然避免了重复代码,但通过不尝试将所有内容打包到一个复杂的语句中,使事情更容易阅读。

于 2013-08-20T06:56:27.020 回答
0

每个“?:”语句都需要分配给某些东西,这意味着

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

不合法,因为它没有分配任何东西。

你可以做:

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

actions[pair.Key](pair.Value, pair.Key)如果并且actions[""](pair.Value, pair.Key);返回一个值,那将是合法的

于 2013-08-20T06:41:50.683 回答