我一直在尋找超載的false
操作符實際執行的實際工作代碼。什麼時候重載的假操作符被執行,它有什麼好處?
This question (What's the false operator in C# good for?)有點相同,但接受的答案鏈接到返回404錯誤的網址。我也看過How does operator overloading of true and false work?和其他一些問題。
我在幾乎所有的答案中發現,當你使用短路和x && y
時,false
只會被執行。這被評估爲T.false(x) ? x : T.&(x, y)
。
好的,所以我有以下代碼。該struct
包含int
並認爲自己真要是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
。然後它在b1和b2上執行&
運算符,該運算符執行逐位和1和-1,結果爲1.所以它確實首先檢查b1是否爲假。
第二個表達式b2 && b1
首先在b2
上執行false
運算符,該運算符返回true
。結合我使用短路的事實,它不會對b1
執行任何操作,只是輸出值b2
。
所以,當您使用短路時,false
運算符會被執行。但是,它不會在第二個參數上執行true
或false
運算符,而是在操作數上執行重載的&
運算符。
什麼時候這可能有用?或者我怎樣才能使我的類型,以便它可以檢查兩個變量是否都是真的?
你試過重載'&&'操作符嗎? – Snowbear
@snowbear:你是什麼意思?你不能重載&&或||運營商。請參見[http://msdn.microsoft.com/en-us/library/8edha89s(v=VS.100).aspx](MSDN)。 – comecme
@Snowbear - 這正是原創文章作者試圖完成的功能,儘管微軟不允許重載&&和||運營商。 – IAmTimCorey