Resharper可能为空参考警告

时间:2011-03-25 15:02:09

标签: c# casting resharper

Resharper为此处的as cast提供了可能的空引用警告。它是否有可能实际发生,或者是否在if语句中检查是否排除它?

IMyObjectType someObject = null; //MyObjectType implements IMyObjectType
if (someObject is MyObjectType)
{
    (someObject as MyObjectType).SomePropery = true;
}

4 个答案:

答案 0 :(得分:8)

编辑:哎呀我在这里错了 - 这是正确答案:

is运算符检查类型兼容性 nullity,因此在这种特殊情况下ReSharper不应该发出警告。

<强>证明

using System;

class Example
{
    static void Main()
    {
        Example example = null;

        // this is always "false"
        Console.WriteLine(example is Example);
    }
}

更多证明:

is (C# Reference)

  

表达式的计算结果为真 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)

我对此也有点好奇,但我可以看到你几乎已经回答了这个问题。

然而,既然我为你制作了这个漂亮的图像,我不妨上传它: enter image description here

相关问题