当我使用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警告:
我查看了"Why is ReSharper suggesting this"的ReSharper页面及其上的链接,但找不到对此的解释。
这是ReSharper的限制吗?还是隐式地检查null是不正确还是不好的风格?
答案 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
,但通常是有效的警告。