为什么当第一个操作数为 false 时重载的 '&' 运算符不触发?
Why overloaded '&' operator does not triggering when the first operand is false?
我需要一些奇怪的东西 class,它可以帮助我创建复杂的谓词并存储组件,这将在另一种情况下对我有所帮助。
我的问题是,当我重载“&”运算符(当然还有 true 和 false 运算符)时,我的“&”运算符在某些情况下不会触发。
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;
但在以下情况下不会,因此我的组件 属性 将是空的:
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;
我该如何解决这个问题?
根据 this,&&
运算符不能重载。
&
是逻辑与,其中 &&
是条件逻辑运算符,也称为短路,这意味着如果第一个条件为假,则不会计算第二个条件。
通常你会在 if 语句和其他谓词中使用 &&
并且在按位级别工作时使用 &
:
if(a && b) // where a and b is booleans
0b0101 & 0b0100 = 0b0100
我需要一些奇怪的东西 class,它可以帮助我创建复杂的谓词并存储组件,这将在另一种情况下对我有所帮助。
我的问题是,当我重载“&”运算符(当然还有 true 和 false 运算符)时,我的“&”运算符在某些情况下不会触发。
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;
但在以下情况下不会,因此我的组件 属性 将是空的:
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;
我该如何解决这个问题?
根据 this,&&
运算符不能重载。
&
是逻辑与,其中 &&
是条件逻辑运算符,也称为短路,这意味着如果第一个条件为假,则不会计算第二个条件。
通常你会在 if 语句和其他谓词中使用 &&
并且在按位级别工作时使用 &
:
if(a && b) // where a and b is booleans
0b0101 & 0b0100 = 0b0100