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

时间:2016-05-28 06:55:35

标签: c# type-conversion resharper nullable 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");
}

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

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

1 个答案:

答案 0 :(得分:6)

当值类型存储为object时,它为boxed。拳击Nullable<T>获得special treatment

  

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

并且,根据documentation for is

  

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

因此,使用这两种方法,您可以推导出(在{null}案例中的fiddle):

bool? x = null;
object obj = x;   // assigns obj = null
obj is bool?      // false, obj is null
obj is bool       // false, obj is 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是正确的:如果truevaluetrue(对象是否来自false,您的第一个分支将评估为boolbool?不相关或甚至不知道。在这种情况下,第二个分支始终为false