簡體   English   中英

為什么“bool?”上沒有解除短路操作符?

[英]Why are there no lifted short-circuiting operators on `bool?`?

為什么不bool? 支持解除了&&|| 他們可以舉起truefalse這將間接地加入解除運營商&&||

運營商| &已經解除並實施正確的三值邏輯 但當然它們不像||那樣短路 &&

問題是為什么他們在創建規范時決定不提升這些操作符。 所以“就像這樣,因為規范說的如此”對“為什么?”沒有答案。

當提升truefalsenull既不是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 && anythingtrue || anything true || anything都會短路(在這兩個例子中, falsetrue都沒有編譯時間常數)。

這與MSDN上DBBool示例非常相似。

我認為解除這些操作員並不會引起任何令人驚訝或危險的行為。 我錯過了什么?

我已經閱讀了另一個關於此的問題 ,但沒有找到令人滿意的答案。


傑夫耶茨的答案顯示了為什么解除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上的truefalse操作符是有意義的。 我不知道這是不是沒有完成的真正原因,但對我來說是有意義的。

既然你表明提升truefalse是技術上是可行的,只有兩個你的問題可能的答案(用“他們”是誰寫的編譯器/規格的人):

  1. 這是規范中的錯誤,即。 他們沒有想到這一點。 (可能,但我懷疑)
  2. 他們認為解除短路操作員可能容易出錯。 它可能與推理相同,因為C#完全基於類(沒有C ++中的唯一函數),或者為什么像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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM