为什么这段代码似乎有错误?
Why does this code seem to exhibit a bug?
我有一个 CanExecute
的 WPF 命令,它的工作方式似乎有所不同,具体取决于我对编译器的明确程度;问题是,我不希望必须是明确的。
private bool CanRemoveField()
{
return SelectedField != null &&
Context.Item.Id == 0
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts;
}
上面的代码,当查询一个 Id != 0
成立的项目时,按钮被启用 尽管 SelectedField
是 null
,所以我希望条件短路并且 return false
.
代码略有调整:
private bool CanRemoveField()
{
return SelectedField != null &&
(Context.Item.Id == 0
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts);
}
我在三元 if 周围引入了一些括号,这现在展示了在未选择任何字段时禁用按钮的所需行为。
考虑到它是一个三元 if 的事实,我期望我想要的行为在不需要括号的情况下成为可能,因为它应该被视为一个语句,不是吗?
由于运算符优先级,您的第一个示例等同于:
private bool CanRemoveField()
{
return (SelectedField != null &&
Context.Item.Id == 0)
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts;
}
您看到的结果很有意义,因为 the &&
logical-and operator has a higher precedence than the ? :
conditional expression。
所以您的第一个代码片段基本上是:
return (SelectedField != null && Context.Item.Id == 0)
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts;
我有一个 CanExecute
的 WPF 命令,它的工作方式似乎有所不同,具体取决于我对编译器的明确程度;问题是,我不希望必须是明确的。
private bool CanRemoveField()
{
return SelectedField != null &&
Context.Item.Id == 0
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts;
}
上面的代码,当查询一个 Id != 0
成立的项目时,按钮被启用 尽管 SelectedField
是 null
,所以我希望条件短路并且 return false
.
代码略有调整:
private bool CanRemoveField()
{
return SelectedField != null &&
(Context.Item.Id == 0
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts);
}
我在三元 if 周围引入了一些括号,这现在展示了在未选择任何字段时禁用按钮的所需行为。
考虑到它是一个三元 if 的事实,我期望我想要的行为在不需要括号的情况下成为可能,因为它应该被视为一个语句,不是吗?
由于运算符优先级,您的第一个示例等同于:
private bool CanRemoveField()
{
return (SelectedField != null &&
Context.Item.Id == 0)
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts;
}
您看到的结果很有意义,因为 the &&
logical-and operator has a higher precedence than the ? :
conditional expression。
所以您的第一个代码片段基本上是:
return (SelectedField != null && Context.Item.Id == 0)
? _fieldsByFieldModel.ContainsKey(SelectedField)
: !_hasAnyCosts;