[英]C# is operator with nullable types always false according to ReSharper
我正在嘗試將object
轉換為bool
類型,並想要轉換bool
和Nullable<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是正確的:如果value
為true
或false
(對象是從bool
還是bool?
分配的,則不相關甚至未知),則您的第一個分支的評估結果為true
。 在這種情況下,第二個分支將始終為false
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.