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

时间:2018-08-30 15:51:13

标签: c# unity3d resharper

当我使用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;
    //}
}

只有隐式null检查才会显示ReSharper警告:

ReSharper-null-check-warning

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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