带或不带括号的空合并算子评估

时间:2018-12-07 17:41:49

标签: c# .net

我有一条在实际评估发生之前针对对象运行的规则。该规则检查集合是否不为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;
    }
}

1 个答案:

答案 0 :(得分:0)

&&的优先级高于??,因此:

a ?? b && c

的评估方式如下:

a ?? (b && c)

在您的情况下,bfalse,而false && c只是false,因此整个过程简化为a ?? false

相关问题