我有一条在实际评估发生之前针对对象运行的规则。该规则检查集合是否不为null以及元素是否具有有效的id(大于零)。使用null集合进行测试时,其行为符合预期。但是,当使用带有无效参数的非null集合进行测试时,求值结果不会达到我的预期。如果不带括号,则包含空合并运算符的表达式将返回true,但带括号的表达式将返回正确的值。试图了解这如何改变操作评估,就像我想象的那样,在两种情况下评估结果都相同。
var testRule = new CollectionRule(null);
testRule.Verify();
//Verify => False
testRule.Verify2();
//Verify2 => False
testRule = new CollectionRule(new int[] { -1 });
testRule.Verify();
//Verify => True
testRule.Verify2();
//Verify2 => False
public class CollectionRule
{
private IEnumerable<int> _elements;
public CollectionRule(IEnumerable<int> elements) => _elements = elements;
public bool Verify()
{
bool result = _elements?.GetEnumerator().MoveNext() ?? false && _elements.All(i => i > 0);
System.Diagnostics.Debug.WriteLine($"Verify => {result}");
return result;
}
public bool Verify2()
{
bool result = (_elements?.GetEnumerator().MoveNext() ?? false) && _elements.All(i => i > 0);
System.Diagnostics.Debug.WriteLine($"Verify2 => {result}");
return result;
}
}
答案 0 :(得分:0)
&&
的优先级高于??
,因此:
a ?? b && c
的评估方式如下:
a ?? (b && c)
在您的情况下,b
是false
,而false && c
只是false
,因此整个过程简化为a ?? false
。