我正在尝试将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的一个问题。
答案 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是正确的:如果true
为value
或true
(对象是否来自false
,您的第一个分支将评估为bool
或bool?
不相关或甚至不知道。在这种情况下,第二个分支始终为false
。