【问题标题】:ReSharper warning for Possible System.NullReferenceException despite implicit null checkReSharper 警告可能 System.NullReferenceException 尽管隐式空检查
【发布时间】:2018-08-30 15:51:13
【问题描述】:

当我使用 if (obj) 而不是 if (obj ! = null) 隐式检查 null 时,我收到了针对 Possible 'System.NullReferenceException' 的 ReSharper (2018.1) 警告。

例如:

using JetBrains.Annotations;
using UnityEngine.UI;

public class CanBeNullTest : MonoBehaviour
{
    [CanBeNull] public Button Button { get; set; }

    private void EnableButton_explicitCheck()
    {
        if (Button != null) Button.enabled = true;
    }

    private void EnableButton_implicitCheck()
    {
        if (Button) Button.enabled = true;
    }

    //private void EnableButton_cSharp6()
    //{
    //    // null propagating operator is not available in C# 4
    //    Button?.enabled = true;
    //}
}

只有隐式空检查显示 ReSharper 警告:

我查看了 "Why is ReSharper suggesting this" 的 ReSharper 页面以及那里的链接,但我找不到对此的解释。

这是 ReSharper 限制吗?还是隐式检查 null 是不正确或不好的风格?

【问题讨论】:

  • 所以 Button 类有一个从 Button 到 bool 的隐式转换?为什么 resharper 应该关心这个?没有约定可以像 javascript 一样使用 C#。
  • @TimSchmelter 哦,我明白了,我很困惑,我认为隐式转换为 bool 是 C# 的内置功能。谢谢。如果您想发表您的评论作为答案,我会将其标记为已接受。

标签: c# unity3d resharper


【解决方案1】:

虽然它实际上不会产生 NullReferenceException,但因为您的 Button 可以为 null 并且 if 语句会触发隐式转换为产生 NullReferenceException 的布尔值,但它通常仍然是有效的警告。

Java 中类似的东西, Check if null Boolean is true results in exception

如果您不喜欢额外的空值检查,您可以执行以下 Java 代码的 C# 等效项,

if (Boolean.TRUE.equals(value)) {...}

【讨论】:

  • 我测试了我发布的代码,它实际上并没有产生NullReferenceException。但是,我看到当对象被隐式转换为 bool 时,ReSharper 说可能存在NullReferenceException 是一个有效的警告。注意:Unity Object 到 bool 的隐式转换:public static implicit operator bool(UnityEngine.Object exists) { return !UnityEngine.Object.CompareBaseObjects(exists, (UnityEngine.Object) null); } - 这是对执行 == null 检查的辅助方法的静态调用(以及似乎与 Unity 的 == 运算符覆盖有关的一些其他检查。)
【解决方案2】:

if (Button) 涉及到 bool 的隐式转换,在这种情况下不会产生 NullReferenceException,但通常是有效的警告。

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多