ReSharper 对 Possible System.NullReferenceException 发出警告,尽管进行了隐式空检查
ReSharper warning for Possible System.NullReferenceException despite implicit null check
当我使用 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 是不正确或糟糕的风格?
尽管它实际上并没有产生 NullReferenceException,因为您的 Button 可以为 null,并且 if 语句触发了到 boolean 的隐式转换,从而产生了 NullReferenceException,但它通常仍然是有效的警告。
Java 中的类似内容,
Check if null Boolean is true results in exception
如果您不喜欢额外的 null 检查,您可以执行与以下 Java 代码等效的 C#,
if (Boolean.TRUE.equals(value)) {...}
if (Button)
涉及到 bool 的隐式转换,在这种情况下不会产生 NullReferenceException
,但它通常是一个有效的警告。
当我使用 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 是不正确或糟糕的风格?
尽管它实际上并没有产生 NullReferenceException,因为您的 Button 可以为 null,并且 if 语句触发了到 boolean 的隐式转换,从而产生了 NullReferenceException,但它通常仍然是有效的警告。
Java 中的类似内容, Check if null Boolean is true results in exception
如果您不喜欢额外的 null 检查,您可以执行与以下 Java 代码等效的 C#,
if (Boolean.TRUE.equals(value)) {...}
if (Button)
涉及到 bool 的隐式转换,在这种情况下不会产生 NullReferenceException
,但它通常是一个有效的警告。