我一直在寻找实际运行的代码,其中重载了 false
运算符。
这个问题 (C# 中 false 运算符有什么作用?) 有些相似,但是被接受的回答链接到了返回404错误的url。我也看过如何操作 true 和 false 的重载以及其他一些问题。
我在几乎所有答案中发现,false
只有在使用短路且运算符时才会执行,例如 x && y
。这被计算为 T.false(x) ? x : T.&(x, y)
。
好的,那么我有以下代码。这个 struct
包含了一个 int
,如果这个整数大于零则认为它是真的。
public struct MyStruct {
private int _i;
public MyStruct(int i) {
_i = i;
}
public static bool operator true(MyStruct ms) {
return ms._i > 0;
}
public static bool operator false(MyStruct ms) {
return ms._i <= 0;
}
public override string ToString() {
return this._i.ToString();
}
}
现在我希望以下程序可以执行并使用重载的 false
运算符。
class Program {
private static void Main() {
MyStruct b1 = new MyStruct(1); // to be considered true
MyStruct b2 = new MyStruct(-1); // to be considered false
Console.WriteLine(b1 && b2);
Console.WriteLine(b2 && b1);
}
}
然而,它甚至不能编译。它说无法对类型为'MyStruct'和'MyStruct'的操作数应用运算符“&&”。
我知道我可以实现一个&运算符的重载。因此,让我们这样做。&必须返回MyStruct,所以我不能使它返回bool。
public static MyStruct operator &(MyStruct lhs, MyStruct rhs) {
return new MyStruct(lhs._i & rhs._i);
}
现在代码已经编译通过。其输出为
1
和-1
。因此,b1 && b2
的结果与b2 && b1
不同。如果我调试代码,会发现
b1 && b2
先在b1
上执行false
运算符,返回false
。然后它对b1和b2执行&
运算符,在1和-1上执行按位与操作,得到1。所以它确实首先检查b1是否为false。第二个表达式
b2 && b1
先在b2
上执行false
运算符,返回true
。结合我使用短路的事实,它不处理b1
,只打印出b2
的值。因此,是的,在使用短路时会执行
false
运算符。但它不会在第二个参数上执行true
或false
运算符,而是在操作数上执行重载的&
运算符。什么情况下可以用到这个技巧呢?或者说,如何让我的类型能够检查两个变量是否都为true?
&&
运算符进行重载吗? - Snowbear