Resharper为此处的as cast提供了可能的空引用警告。它是否有可能实际发生,或者是否在if语句中检查是否排除它?
IMyObjectType someObject = null; //MyObjectType implements IMyObjectType
if (someObject is MyObjectType)
{
(someObject as MyObjectType).SomePropery = true;
}
答案 0 :(得分:8)
编辑:哎呀我在这里错了 - 这是正确答案:
is
运算符检查类型兼容性和 nullity,因此在这种特殊情况下ReSharper不应该发出警告。
<强>证明强>:
using System;
class Example
{
static void Main()
{
Example example = null;
// this is always "false"
Console.WriteLine(example is Example);
}
}
更多证明:
表达式的计算结果为真 if 提供的表达式为非null , 并且可以将提供的对象强制转换为 提供的类型没有导致 抛出异常。
旧答案: 这是不正确的,但为了完整起见,我会将其保留在此处。
是的,someObject
仍然可以在此null
。
这只检查变量的类型:
someObject is MyObjectType
someObject
的类型很可能是MyObjectType
,但可能无处可指。换句话说,引用的类型与该引用是否指向对象的实例之间存在差异。
答案 1 :(得分:4)
是的,is
检查排除了它。
事实证明,你的检查并不能保护你免受所有情况的伤害。请考虑以下事项:
MyObjectType obj = null;
ParentType someObject = obj;
在这种情况下, is
检查会成功,但值仍为null
。
<强>更新强>
当我写上面的例子时,如果我是正确的,我很好奇。事实证明我不是。上面的检查将始终返回false(因为实际值为null)。
您可以将其设置得更清洁,并通过将代码更改为:
来删除警告var castObject = someObject as MyObjectType;
if(castObject != null)
castObject.SomeProperty = true;
答案 2 :(得分:2)
我不认为ReSharper会那么聪明。但无论如何,我通常看到的是
MyObjectType someTypedObject = someObject as MyObjectType;
if (someTypedObject != null)
{
// use the object
}
答案 3 :(得分:0)
我对此也有点好奇,但我可以看到你几乎已经回答了这个问题。
然而,既然我为你制作了这个漂亮的图像,我不妨上传它: