C# Resharper可能为空引用警告
Resharper为此处的转换提供可能的空引用警告。是否存在实际发生的可能性,或者if语句中的Is检查是否排除了这种可能性C# Resharper可能为空引用警告,c#,casting,resharper,C#,Casting,Resharper,Resharper为此处的转换提供可能的空引用警告。是否存在实际发生的可能性,或者if语句中的Is检查是否排除了这种可能性 IMyObjectType someObject = null; //MyObjectType implements IMyObjectType if (someObject is MyObjectType) { (someObject as MyObjectType).SomePropery = true; } 编辑:哎呀,我在这里全错了-下面是正确的答案: i
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);
}
}
更多证据:
:
is表达式的计算结果为trueif
提供的表达式为非空,
并且可以将提供的对象投射到
提供的类型不会导致错误
要抛出的异常
旧答案:这是不正确的,但为了完整起见,我将把它留在这里 是的,
someObject
在这里仍然可以是null
这仅检查变量的类型:
someObject
的类型很可能是MyObjectType
,但不能指向任何地方。换句话说,引用的类型与引用是否指向对象的实例之间存在差异。是的,is
复选框排除它。
事实证明,你的is支票并不能保护你免受所有情况的伤害。考虑以下事项:
MyObjectType obj = null;
ParentType someObject = obj;
在这种情况下,is
检查将成功,但值仍将为null
更新
当我写上面的例子时,我很好奇我是否正确。原来我不是。上面的is检查将始终返回false(因为实际值为null)
您可以将代码更改为:
var castObject = someObject as MyObjectType;
if(castObject != null)
castObject.SomeProperty = true;
我不认为ReSharper会那么聪明。但无论如何,我通常看到的是与
MyObjectType someTypedObject = someObject as MyObjectType;
if (someTypedObject != null)
{
// use the object
}
我对此也有点好奇,但我可以看出你已经回答了这个问题 但是,既然我为您制作了这张漂亮的图片,我不妨上传它:
它怎么还能为空?在测试中我找不到一种方法可以让某个对象为null并通过IF。好的,这是真的。我被它建议的将行更改为
((MyObjectType)someObject)的修复程序抛出代码>,但如果someObject为null,这将不会有帮助,尽管resharper认为如果我进行了更改也没问题。如果someObject为null,则不是true,`someObject为MyObjectType将计算为false<代码>对象o=null;如果(o是对象)抛出null
这不会抛出,因为null
似乎总是在is
上返回null
。嗯,我自己刚刚测试过,看起来只有当某个对象是MyObject类型时才是这样。在本例中,它是IMyObject,虽然MyObjectType实现IMyObject,但如果我将其设置为null,它不会传递到if语句中。这是null指针的问题,因此,NullReferenceException
BTW,它不会在我的机器上显示警告。Resharper版本5.1.3。有someObject
作为类字段。@Snowbear-JIM编译器。我正在运行5.1.3000.12(与5.1.3相同?)。我想知道我的实际代码和这个例子有什么不同?@Dan,是的,我还有5.1.3000.12
。不知道是什么原因。您当前的代码仅给出表达式始终为false
警告,但即使我将忽略它,我也没有任何其他警告。@Snowbear JIM编译器是我的pebkac。我检查了someObject,然后铸造了someObject2,两者都是IMyObjectType。其他约束要求someObject和someObject2始终为同一类型(MyObjectType、MyObjectType2等);但对于resharper来说,没有明显的方法可以解决这个问题。至少意识到实际问题会让关闭resharper变得容易。
MyObjectType someTypedObject = someObject as MyObjectType;
if (someTypedObject != null)
{
// use the object
}