使用三元运算符:“仅分配,调用,增量......”

时间:2013-08-20 06:36:15

标签: c# .net

我将动作词典定义为:

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) 不是电话吗?我错过了什么吗?是否可以使用'?'动作词典的符号?我试图找到一些相关的东西,但很难找到关于'?'的任何内容。运算符和此错误,因为'?'被谷歌忽略。

5 个答案:

答案 0 :(得分:20)

请改为尝试:

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

这将解决您的问题。

答案 1 :(得分:13)

?: Conditional operator定义为:

  

条件运算符(?:) 返回两个值之一,具体取决于布尔表达式的值

您的操作不会返回一个值,那么?:的返回值是什么意思?

答案 2 :(得分:6)

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

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

来自: Operator (C# Reference)

澄清一下
  

条件必须评估为真或假。如果条件为真,   first_expression被评估并成为结果。如果条件是   false,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";

答案 3 :(得分:6)

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

替代方案包括以下内容:

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

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

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

答案 4 :(得分: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);返回值

,这将是合法的