当我用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警告:
我查看了"Why is ReSharper suggesting this"的ReSharper页面及其中的链接,但我找不到对此的解释。
这是ReSharper的限制吗?或隐式检查null是不正确还是坏的风格?
虽然它实际上不会产生NullReferenceException,因为您的Button可以为null并且if语句触发隐式转换为产生NullReferenceException的boolean,但它仍然是有效的警告。
类似Java,Check if null Boolean is true results in exception
如果您不喜欢额外的空值检查,您可能能够执行以下Java代码的C#等价物,
if (Boolean.TRUE.equals(value)) {...}
if (Button)
涉及到bool的隐式转换,在这种情况下不会产生NullReferenceException
,但它一般是有效的警告。