Ben*_*ell 2 c# resharper nullable type-conversion resharper-2016
我正在尝试将一个转换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");
}
Run Code Online (Sandbox Code Playgroud)
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>
得到特殊待遇:
如果对象为非null,则仅基于可空类型的对象进行装箱.如果HasValue为false,则将对象引用赋值为null而不是装箱 ...将非null可空值类型框装入值类型本身,而不是包装值类型的System.Nullable.
并且,根据以下文档is
:
如果提供的表达式为非null,则is表达式求值为true ,并且可以将提供的对象强制转换为提供的类型,而不会引发异常.
所以,使用这两个你可以推断出(在小调的情况下):
bool? x = null;
object obj = x; // assigns obj = null
obj is bool? // false, obj is null
obj is bool // false, obj is null
Run Code Online (Sandbox Code Playgroud)
并且在非空案例中:
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
Run Code Online (Sandbox Code Playgroud)
因此,ReSharper是正确的:您的第一个分支将进行评估,就true
好像value
是true
或false
(对象是从一个分配bool
还是bool?
不相关或甚至已知).false
在这种情况下,第二个分支将永远是.
归档时间: |
|
查看次数: |
702 次 |
最近记录: |