2011-03-25 105 views
3

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

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

顺便说一句,它并不显示警告*我的机器上*。 Resharper ver 5.1.3。将'someObject'作为类字段。 – Snowbear 2011-03-25 15:16:35

+0

@ Snowbear JIM编译器奇怪。我正在运行5.1.3000.12(与5.1.3相同?)。我想知道我的实际代码和这个例子有什么不同? – 2011-03-25 15:26:44

+0

@丹,是的,我也有'5.1.3000.12'。不知道是什么原因。你目前的代码只给出'表达总是虚假'的警告,但即使我会忽略它,我没有任何更多的警告。 – Snowbear 2011-03-25 15:41:47

回答

8

编辑:哎呦我都错在这里 - 在这里是正确的答案:

is操作检查类型兼容性无效所以ReSharper的不应该在这种特殊情况下发出警告。

证明

using System; 

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

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

更多证明:

is (C# Reference)

An是表达式计算为如果 所提供的表达是非空真, 并且所提供的对象可以被转换为 所提供的类型,而不会引起 异常被抛出。


老答案:这是不正确但完整起见,我将离开这里。

是的,someObject仍然可以在这里null

这只检查变量类型:

someObject is MyObjectType 

类型的someObject很可能是MyObjectType但也无处点。换言之,引用的类型与该引用是否指向对象的实例之间存在差异。

+0

它怎么还是空?我无法找到一种方法来测试我可以让someObject为null并通过IF。 – 2011-03-25 15:06:09

+1

好吧,那是真的。我被抛出建议将修改行改为'((MyObjectType)someObject).SomePropery = true;',但如果someObject为null,这将无济于事,尽管如果我进行更改,resharper认为没关系。 – 2011-03-25 15:07:14

+0

@Andrew:关于类型与价值的非常好的一点。 – 2011-03-25 15:07:16

4

是的,is检查排除它。

事实证明,您的支票并不能保护您免受所有情况的影响。考虑以下几点:

MyObjectType obj = null; 
ParentType someObject = obj; 

在这种情况下, is检查将成功,但价值依然会 null

更新

我很好奇,当我写上面,如果我是正确与否的例子。事实证明,我没有。上面的检查将始终返回false(因为实际值为空)。

你可以做这一点清洁剂,并通过改变你的代码删除警告:

var castObject = someObject as MyObjectType; 

if(castObject != null) 
    castObject.SomeProperty = true; 
+0

嗯,只是自己测试过,看起来这只有当someObject是MyObjectType时才是真的。在这种情况下,它是IMyObject,而MyObjectType实现IMyObject时,如果将其设置为null,则它不会传入if语句。 – 2011-03-25 15:13:08

+0

这是空指针的事情,因此'NullReferenceException' – 2011-03-25 15:20:15

2

我不认为ReSharper的将是聪明的。但在任何情况下我通常看到的是沿

MyObjectType someTypedObject = someObject as MyObjectType; 
if (someTypedObject != null) 
{ 
// use the object 
} 
0

我当时也有点好奇这个线的东西,但我可以看到你很可能已经回答了这个问题。

但是,因为我为你做的这个良好的形象,我还不如把它上传: enter image description here