7

我正在尝试将 an 转换objectbool类型并想要转换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 的问题。

4

1 回答 1

9

当值类型按装箱object方式存储时。拳击得到特殊待遇Nullable<T>

基于可空类型的对象仅在对象非空时才被装箱。如果 HasValue 为 false,则将对象引用分配给 null 而不是装箱……装箱一个非 null 可为空的值类型将值类型本身装箱,而不是包装值类型的 System.Nullable。

并且,根据以下文档is

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

因此,使用这两种方法,您可以推断(参见fiddle)在 null 情况下:

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好像valuetruefalse(无论对象是从 a 分配的bool还是bool?不相关的甚至是已知的)。false在这种情况下,第二个分支将始终存在。

于 2016-05-28T07:59:26.283 回答