Resharper为此处投的可能的空引用警告。它是否有可能实际发生,或者检查if语句是否排除了它?Resharper可能的空引用警告
IMyObjectType someObject = null; //MyObjectType implements IMyObjectType
if (someObject is MyObjectType)
{
(someObject as MyObjectType).SomePropery = true;
}
Resharper为此处投的可能的空引用警告。它是否有可能实际发生,或者检查if语句是否排除了它?Resharper可能的空引用警告
IMyObjectType someObject = null; //MyObjectType implements IMyObjectType
if (someObject is MyObjectType)
{
(someObject as MyObjectType).SomePropery = true;
}
编辑:哎呦我都错在这里 - 在这里是正确的答案:
的is
操作检查类型兼容性和无效所以ReSharper的不应该在这种特殊情况下发出警告。
证明:
using System;
class Example
{
static void Main()
{
Example example = null;
// this is always "false"
Console.WriteLine(example is Example);
}
}
更多证明:
An是表达式计算为如果 所提供的表达是非空真, 并且所提供的对象可以被转换为 所提供的类型,而不会引起 异常被抛出。
老答案:这是不正确但完整起见,我将离开这里。
是的,someObject
仍然可以在这里null
。
这只检查变量类型:
someObject is MyObjectType
类型的someObject
很可能是MyObjectType
但也无处点。换言之,引用的类型与该引用是否指向对象的实例之间存在差异。
它怎么还是空?我无法找到一种方法来测试我可以让someObject为null并通过IF。 – 2011-03-25 15:06:09
好吧,那是真的。我被抛出建议将修改行改为'((MyObjectType)someObject).SomePropery = true;',但如果someObject为null,这将无济于事,尽管如果我进行更改,resharper认为没关系。 – 2011-03-25 15:07:14
@Andrew:关于类型与价值的非常好的一点。 – 2011-03-25 15:07:16
是的,is
检查排除它。
事实证明,您的支票并不能保护您免受所有情况的影响。考虑以下几点:
MyObjectType obj = null;
ParentType someObject = obj;
在这种情况下,
is
检查将成功,但价值依然会
null
。
更新
我很好奇,当我写上面,如果我是正确与否的例子。事实证明,我没有。上面的检查将始终返回false(因为实际值为空)。
你可以做这一点清洁剂,并通过改变你的代码删除警告:
var castObject = someObject as MyObjectType;
if(castObject != null)
castObject.SomeProperty = true;
嗯,只是自己测试过,看起来这只有当someObject是MyObjectType时才是真的。在这种情况下,它是IMyObject,而MyObjectType实现IMyObject时,如果将其设置为null,则它不会传入if语句。 – 2011-03-25 15:13:08
这是空指针的事情,因此'NullReferenceException' – 2011-03-25 15:20:15
我不认为ReSharper的将是聪明的。但在任何情况下我通常看到的是沿
MyObjectType someTypedObject = someObject as MyObjectType;
if (someTypedObject != null)
{
// use the object
}
我当时也有点好奇这个线的东西,但我可以看到你很可能已经回答了这个问题。
但是,因为我为你做的这个良好的形象,我还不如把它上传:
顺便说一句,它并不显示警告*我的机器上*。 Resharper ver 5.1.3。将'someObject'作为类字段。 – Snowbear 2011-03-25 15:16:35
@ Snowbear JIM编译器奇怪。我正在运行5.1.3000.12(与5.1.3相同?)。我想知道我的实际代码和这个例子有什么不同? – 2011-03-25 15:26:44
@丹,是的,我也有'5.1.3000.12'。不知道是什么原因。你目前的代码只给出'表达总是虚假'的警告,但即使我会忽略它,我没有任何更多的警告。 – Snowbear 2011-03-25 15:41:47