繁体   English   中英

为什么当第一个操作数为假时,重载的 '&' 运算符不会触发?

[英]Why overloaded '&' operator does not triggering when the first operand is false?

我需要一点奇怪的 class 来帮助我制作复杂的谓词并存储在另一种情况下对我有帮助的组件。

我的问题是,当我重载“&”运算符(当然还有真假运算符)时,我的“&”运算符在某些情况下不会触发。

public class ObservablePredicate // : IObservable<bool> does not need now
{
    public ObservablePredicate Parent { get; set; }
    public IList<ObservablePredicate> Components { get; set; }

    public static bool operator true(ObservablePredicate x)
    {
        return x.Value;
    }

    public static bool operator false(ObservablePredicate x)
    {
        return !x.Value;
    }

    public static ObservablePredicate operator &(ObservablePredicate a, ObservablePredicate b)
    {
        if (a == null) a = new ObservablePredicate(false);
        if (b == null) b = new ObservablePredicate(false);

        var result = a.Value && b.Value;
        return new ObservablePredicate(result, a, b);
    }

    private bool _value;
    public bool Value
    {
        get => _value;
        set
        {
            _value = value;
            // do something with components if exists...
            // do something with parent if exists...
        }
    }

    public ObservablePredicate(ObservablePredicate p)
    {
        Initialise(p.Value, null);
    }

    public ObservablePredicate(bool value, params ObservablePredicate[] predicates)
    {
        predicates.ToList().ForEach(p => p.Parent = this);
        Initialise(value, predicates.ToList());
    }

    private void Initialise(bool value, List<ObservablePredicate> components)
    {
        Components = components ?? new List<ObservablePredicate>();
        Value = value;
    }
}

“&”运算符在以下情况下触发:

var prediacteA = new ObservablePredicate(true);
var predicateB = new ObservablePredicate(true);
var predicateC = prediacteA && predicateB;
var prediacteA = new ObservablePredicate(true);
var predicateB = new ObservablePredicate(false);
var predicateC = prediacteA && predicateB;

但不是在以下情况下,因此我的 Components 属性将为空:

var prediacteA = new ObservablePredicate(false);
var predicateB = new ObservablePredicate(true);
var predicateC = prediacteA && predicateB;
var prediacteA = new ObservablePredicate(false);
var predicateB = new ObservablePredicate(false);
var predicateC = prediacteA && predicateB;

我该如何解决这个问题?

据此&&运算符不能重载。

&是逻辑与,其中&&是条件逻辑运算符,也称为短路,这意味着如果第一个条件为假,则不会评估第二个条件。

通常,在 if 语句和其他谓词中&在按位级别工作时,您总是会使用&&

if(a && b) // where a and b is booleans

0b0101 & 0b0100 = 0b0100

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM