我有一个CanExecute
的WPF命令似乎有所不同,这取决于我对编译器的明确程度;问题是,我不希望必须明确。
private bool CanRemoveField()
{
return SelectedField != null &&
Context.Item.Id == 0
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts;
}
上面的代码,当查询Id != 0
成立的项目时,按钮启用尽管 SelectedField
为null
,所以我期待短路并返回false
的条件。
代码略有调整:
private bool CanRemoveField()
{
return SelectedField != null &&
(Context.Item.Id == 0
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts);
}
我已经在三元组周围引入了一些括号,现在它显示了在没有选择字段时禁用按钮的所需行为。
鉴于它是一个三元组,如果,我已经预料到我想要的行为,而不需要括号,因为它应该被视为一个陈述,不是吗?
答案 0 :(得分:8)
由于运算符优先级,您的第一个示例等同于:
private bool CanRemoveField()
{
return (SelectedField != null &&
Context.Item.Id == 0)
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts;
}
答案 1 :(得分:5)
您看到的结果很有意义,因为the &&
logical-and operator has a higher precedence than the ? :
conditional expression。
所以你的第一个代码片段基本上是:
return (SelectedField != null && Context.Item.Id == 0)
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts;