我有一个WCC命令的CanExecute,它的工作方式似乎有所不同,具体取决于我对编译器的了解程度。问题是,我不希望必须明确。

private bool CanRemoveField()
{
    return SelectedField != null &&
        Context.Item.Id == 0
        ? _fieldsByFieldModel.ContainsKey(SelectedField)
        : !_hasAnyCosts;
}


上面的代码在查询Id != 0保持为true的项目时,尽管SelectedFieldnull,按钮仍处于启用状态,因此我希望条件会短路并返回false

代码稍作调整:

private bool CanRemoveField()
{
    return SelectedField != null &&
        (Context.Item.Id == 0
        ? _fieldsByFieldModel.ContainsKey(SelectedField)
        : !_hasAnyCosts);
}


我在三元组if周围引入了一些括号,这现在表现出在未选择任何字段时禁用按钮的期望行为。

考虑到它是三元组,如果我希望我的行为不需要括号就可以实现,因为它应该被视为一个陈述,不是吗?

最佳答案

the && logical-and operator has a higher precedence than the ? : conditional expression开始,您看到的结果有意义。

因此,您的第一个代码段实质上是:

return (SelectedField != null && Context.Item.Id == 0)
    ? _fieldsByFieldModel.ContainsKey(SelectedField)
    : !_hasAnyCosts;

09-06 00:18