Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Resharper可能为空引用警告_C#_Casting_Resharper - Fatal编程技术网

C# Resharper可能为空引用警告

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

Resharper为此处的转换提供可能的空引用警告。是否存在实际发生的可能性,或者if语句中的Is检查是否排除了这种可能性

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
}