繁体   English   中英

根据ReSharper,C#是具有可空类型的运算符,始终为false

[英]C# is operator with nullable types always false according to ReSharper

我正在尝试将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的问题。

当值类型存储为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是正确的:如果valuetruefalse (对象是从bool还是bool?分配的,则不相关甚至未知),则您的第一个分支的评估结果为true 在这种情况下,第二个分支将始终为false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM