【问题标题】:Why overloaded '&' operator does not triggering when the first operand is false?为什么当第一个操作数为假时,重载的 '&' 运算符不会触发?
【发布时间】:2020-09-10 05:26:25
【问题描述】:

我需要一个奇怪的类,它可以帮助我制作复杂的谓词并存储在另一个场景中对我有帮助的组件。

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

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;

我该如何解决这个问题?

【问题讨论】:

    标签: c# operator-overloading operators operator-keyword


    【解决方案1】:

    根据this&amp;&amp;操作符不能超载。

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

    通常在 if 语句和其他谓词中使用 &amp;&amp;,在按位处理时使用 &amp;

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

    0b0101 &amp; 0b0100 = 0b0100

    【讨论】:

    • &amp;&amp; 将调用用户定义的运算符,但它会重用 &amp; 运算符,并且如果第一个计算结果为 false,它将不会计算第二个操作数,这与 @ 的方式一致987654332@ 应该可以工作。请注意,&amp; 也是一个逻辑运算符,但您可以为它声明一个用户定义的运算符。
    猜你喜欢
    • 2017-01-18
    • 2012-09-23
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多