[英]Why are there no lifted short-circuiting operators on `bool?`?
為什么不bool?
支持解除了&&
和||
? 他們可以舉起true
和false
這將間接地加入解除運營商&&
和||
。
運營商|
和&
已經解除並實施正確的三值邏輯 。 但當然它們不像||
那樣短路 和&&
。
問題是為什么他們在創建規范時決定不提升這些操作符。 所以“就像這樣,因為規范說的如此”對“為什么?”沒有答案。
當提升true
和false
, null
既不是true
也不是false
:
public static bool operator true(bool? x)
{
return x.HasValue && x.Value
}
public static bool operator false(bool? x)
{
return x.HasValue && !x.Value
}
這會導致&&
和||
表現就像他們的非短路同行一樣。 除了false && anything
和true || anything
true || anything
都會短路(在這兩個例子中, false
和true
都沒有編譯時間常數)。
我認為解除這些操作員並不會引起任何令人驚訝或危險的行為。 我錯過了什么?
我已經閱讀了另一個關於此的問題 ,但沒有找到令人滿意的答案。
傑夫耶茨的答案顯示了為什么解除true
/ false
運算符不是最優的一個很好的理由,它沒有解釋為什么提升&&
和||
直接壞了。 由於運算符提升是編譯器魔術,特殊情況Nullable<T>
它不需要遵循正常類型的重載規則,因此可以提供&&
/ ||
沒有提升true
。
你建議的是為可空類型創建兩種不同的使用模式。
請考慮以下代碼:
bool? a = null;
// This doesn't currently compile but would with lifted true/false operators.
if (a)
{
}
// Whereas this provides a consistent use of nullable types.
if (a ?? false)
{
}
為了使用可空類型的一致性,不要解除bool
上的true
和false
操作符是有意義的。 我不知道這是不是沒有完成的真正原因,但對我來說是有意義的。
既然你表明提升true
和false
是技術上是可行的,只有兩個你的問題可能的答案(用“他們”是誰寫的編譯器/規格的人):
if (myNullVar) { ... }
( myNullVar
是引用)這樣的語句在C#中不起作用(但它在C / C ++中)。 我認為在使編程語言更強大並使其更不容易出錯之間總是存在平衡。
更新:只是為了您的興趣,這就是官方文檔所說的:
這是不允許的,因為不清楚null在條件的上下文中意味着什么。
false && anything
都與false
相同。 但是,如果你false && anything
只有在anything
是假的時候才是真的那么!anything
那就是你想要的!anything
。
另外, true || anything
true || anything
都和true
。 ......而且我不確定你怎么能在任何情況下讓它返回假,因為沒有任何意義讓“這個或那個”什么都不返回!
...為什么在條件清晰簡單的情況下為條件增加額外的重量?
我通常不熟悉“因為這是如此”,但我沒有看到添加此類功能的優勢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.