[英]C# is operator with nullable types always false according to ReSharper
我正在尝试将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的问题。
当值类型存储为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是正确的:如果value
为true
或false
(对象是从bool
还是bool?
分配的,则不相关甚至未知),则您的第一个分支的评估结果为true
。 在这种情况下,第二个分支将始终为false
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.