我有动作字典定义为:
var actions = new Dictionary<string, Action<string, string>>();
Run Code Online (Sandbox Code Playgroud)
我把行动放在:
actions.Add("default", (value, key) => result.Compare(value, properties[key], Comparers.SomeComparer, key));
...
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码来运行它:
if (actions.ContainsKey(pair.Key))
{
actions[pair.Key](pair.Value, pair.Key);
}
else
{
actions[""](pair.Value, pair.Key);
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我想用'?' 缩短的注意事项:
actions.ContainsKey(pair.Key) ? actions[pair.Key](pair.Value, pair.Key) : actions[""](pair.Value, pair.Key);
Run Code Online (Sandbox Code Playgroud)
此代码显示错误:
错误1只能将赋值,调用,递增,递减和新对象表达式用作语句
actions[pair.Key](pair.Value, pair.Key) 不是电话吗?我错过了什么吗?是否可以使用'?' 动作词典的符号?我试图找到一些相关的东西,但很难找到关于'?'的任何内容.运算符和此错误,因为'?' 被谷歌忽略了.
Kun*_*han 20
试试这个:
actions[actions.ContainsKey(pair.Key) ? pair.key : ""](pair.Value, pair.Key);
Run Code Online (Sandbox Code Playgroud)
这将解决您的问题.
如果你真的必须这样做,你可以试试
actions[actions.ContainsKey(pair.Key) ? pair.Key : ""](pair.Value, pair.Key);
Run Code Online (Sandbox Code Playgroud)
只是为了澄清,来自:运营商(C#参考)
条件必须评估为真或假.如果condition为true,则计算first_expression并成为结果.如果condition为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";
Run Code Online (Sandbox Code Playgroud)
你的电话本身并没有错.表达actions[pair.Key](pair.Value, pair.Key)确实是一个电话.不过,这不是编译器抱怨的表达方式.编译器指的是整个条件运算符表达式,它既不是赋值,调用,递增,递减,也不是新对象表达式,因此不允许它本身作为语句.
替代方案包括以下内容:
使用两个独立的语句来决定使用哪个键,然后调用该函数:
var key = actions.ContainsKey(pair.Key) ? pair.Key : "";
actions[key](pair.Value, pair.Key);
Run Code Online (Sandbox Code Playgroud)
它仍然避免重复代码,但是通过不尝试将所有内容打包到一个复杂的语句中来使事情更容易阅读.
| 归档时间: |
|
| 查看次数: |
5251 次 |
| 最近记录: |