尽管隐式空检查,但ReSharper警告可能的System.NullReferenceException

问题描述 投票:2回答:2

当我用Possible 'System.NullReferenceException'而不是if (obj)隐式检查null时,我收到if (obj ! = null)的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警告:

ReSharper-null-check-warning

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

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

c# unity3d resharper
2个回答
2
投票

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

类似Java,Check if null Boolean is true results in exception

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

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

1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.