根据ReSharper,C#是可空类型的运算符,总是为false

Ben*_*ell 2 c# resharper nullable type-conversion resharper-2016

我正在尝试将一个转换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");
}
Run Code Online (Sandbox Code Playgroud)

ReSharper 2016告诉我value is bool?在if语句堆栈中总会评估为false.这是为什么?这意味着Nullable<bool>不会继承object(不可能)或value is bool将会捕获bool?.

ReSharper 2016也有可能出现错误; 我看到实现System.Windows.Controls.BooleanToVisibilityConverter.Convert几乎完全相同.我怀疑WPF核心会有这样的错误,让我相信这是ReSharper的一个问题.

Cha*_*ger 6

当值类型object装箱时存储它.拳击Nullable<T>得到特殊待遇:

如果对象为非null,则仅基于可空类型的对象进行装箱.如果HasValue为false,则将对象引用赋值为null而不是装箱 ...将非null可空值类型装入值类型本身,而不是包装值类型的System.Nullable.

并且,根据以下文档is:

如果提供的表达式为非null,则is表达式求值为true ,并且可以将提供的对象强制转换为提供的类型,而不会引发异常.

所以,使用这两个你可以推断出(在小调的情况下):

bool? x = null;
object obj = x;   // assigns obj = null
obj is bool?      // false, obj is null
obj is bool       // false, obj is null
Run Code Online (Sandbox Code Playgroud)

并且在非空案例中:

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
Run Code Online (Sandbox Code Playgroud)

因此,ReSharper是正确的:您的第一个分支将进行评估,就true好像valuetruefalse(对象是从一个分配bool还是bool?不相关或甚至已知).false在这种情况下,第二个分支将永远是.