我将动作词典定义为:
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)
不是电话吗?我错过了什么吗?是否可以使用'?'动作词典的符号?我试图找到一些相关的东西,但很难找到关于'?'的任何内容。运算符和此错误,因为'?'被谷歌忽略。
答案 0 :(得分:20)
请改为尝试:
actions[actions.ContainsKey(pair.Key) ? pair.key : ""](pair.Value, pair.Key);
这将解决您的问题。
答案 1 :(得分:13)
答案 2 :(得分:6)
如果您真的必须这样做,可以尝试
actions[actions.ContainsKey(pair.Key) ? pair.Key : ""](pair.Value, pair.Key);
澄清一下
条件必须评估为真或假。如果条件为真, 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);
返回值