【问题标题】:Resharper possible null reference warningResharper 可能的空引用警告
【发布时间】:2011-03-25 15:02:08
【问题描述】:

Resharper 在这里为 as cast 提供了一个可能的空引用警告。它是否有任何实际发生的可能性,或者 if 语句中的 is 检查是否排除了它?

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

【问题讨论】:

  • 顺便说一句,在我的机器上没有显示警告。 Resharper 版本 5.1.3。将someObject 作为类字段。
  • @Snowbear JIM 编译器很奇怪。我正在运行 5.1.3000.12(与 5.1.3 相同?)。我想知道我的实际代码和这个例子有什么不同?
  • @Dan,是的,我也有5.1.3000.12。不知道是什么原因。您当前的代码仅给出expression is always false 警告,但即使我会忽略它,我也不会再收到任何警告。
  • @Snowbear JIM-compiler 我是 pebkac。我正在检查 someObject,然后投射 so​​meObject2,两者都是 IMyObjectType。其他约束要求 someObject 和 someObject2 始终为同一类型(MyObjectType、MyObjectType2 等);但是没有明显的方法让 resharper 能够弄清楚这一点。
  • 至少意识到实际问题会很容易关闭resharper。

标签: c# casting resharper


【解决方案1】:

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

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

证明:

using System;

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

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

更多证据:

is (C# Reference):

一个 is 表达式的计算结果为真 如果 提供的表达式不为空, 并且提供的对象可以转换为 提供的类型而不引起 抛出异常。


旧答案: 这是不正确的,但为了完整起见,我将其留在这里。

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

这只检查变量的类型:

someObject is MyObjectType

someObject 的类型很可能是MyObjectType,但无法指向任何地方。换句话说,引用的类型与该引用是否指向对象的实例之间存在差异。

【讨论】:

  • 怎么还能为空呢?我在测试中找不到可以让 someObject 为 null 并通过 IF 的方法。
  • 好的,没错。我被它建议的将 line 更改为 ((MyObjectType) someObject).SomePropery = true; 的修复方法所引发,但如果 someObject 为 null 这将无济于事,尽管 resharper 认为如果我进行更改就可以了。
  • 不正确,如果 someObject 为 null `someObject is MyObjectType 将评估为 false。 dotnetpad.net/ViewPaste/BaF94diL6EGbrfZyhHCXOQ
  • object o = null; if (o is object) throw null; 这不会抛出,因为null 似乎总是在is 上返回null。
【解决方案2】:

是的,is 检查排除了它。

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

MyObjectType obj = null;
ParentType someObject = obj;

在这种情况下,is 检查将成功,但值仍为 null。

更新

当我写上面的例子时,我很好奇我是否正确。事实证明我不是。上面的 is 检查总是会返回 false(因为实际值为 null)。

您可以将代码更改为:

var castObject = someObject as MyObjectType;

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

【讨论】:

  • hmmm,刚刚自己测试过,看起来只有当 someObject 是 MyObjectType 时才会这样。在这种情况下,它是 IMyObject,而 MyObjectType 实现 IMyObject,如果我将它设置为 null,它不会传递到 if 语句中。
  • 这是带有空指针的东西,因此是NullReferenceException
【解决方案3】:

我认为 ReSharper 不会那么聪明。但无论如何,我通常看到的是类似于

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

【讨论】:

    【解决方案4】:

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

    不过,既然我为你做了这张漂亮的图片,我不妨上传它:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2021-08-27
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多