簡體   English   中英

根據ReSharper,C#是具有可空類型的運算符,始終為false

[英]C# is operator with nullable types always false according to ReSharper

我正在嘗試將object轉換為bool類型,並想要轉換boolNullable<bool>類型。 我還想確保在可能的情況下進行適當的投射。 所以我有以下代碼:

if (value is bool)
{
    boolValue = (bool) value;
}
else if (value is bool? && ((bool?)value).HasValue)
{
    boolValue = ((bool?) value).Value;
}
else
{
    throw new ArgumentException("Value must be a boolean type");
}

ReSharper 2016告訴我, value is bool? 在此if語句堆棧中將始終為false。 這是為什么? 這意味着Nullable<bool>不會從object繼承(不可能),或者value is bool會捕獲bool?

ReSharper 2016也可能有錯誤; 我看到System.Windows.Controls.BooleanToVisibilityConverter.Convert的實現幾乎相同。 我懷疑WPF內核中是否會有這樣的錯誤,使我相信ReSharper的問題。

當值類型存儲為object裝箱 Nullable<T>拳擊獲得特殊待遇

僅當對象為非空時,才將基於可為空類型的對象裝箱。 如果HasValue為false,則將對象引用分配給null而不是裝箱 ...將非null的可空值類型裝箱將值類型本身裝箱 ,而不是包裝值類型的System.Nullable。

而且,按照文檔is

如果提供的表達式為非null ,則is表達式的計算結果為true,並且可以將提供的對象強制轉換為提供的類型而不會引發異常。

因此,使用這兩種方法,您可以推斷出(請參見fiddle )在空情況下的情況:

bool? x = null;
object obj = x;   // assigns obj = null
obj is bool?      // false, obj is null
obj is bool       // false, obj is null

在非null的情況下:

bool? x = true;
object obj =  x;  // obj is boxed bool (true)
obj is bool?      // true, obj unboxes to bool?
obj is bool       // true, obj unboxes to bool

因此ReSharper是正確的:如果valuetruefalse (對象是從bool還是bool?分配的,則不相關甚至未知),則您的第一個分支的評估結果為true 在這種情況下,第二個分支將始終為false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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