组合空值和值检查
Combined null and value check
这段代码工作正常:
policy.ProviderID > 0 ? RefDataSources.LegalBodies.GetDisplayName(policy.ProviderID.Value) : null
但 Resharper 抱怨 policy.ProviderID.Value
需要 null
检查(以防止 InvalidOperationException
)。
据我所知,条件只会对大于 0
的非空值计算为真,因此不需要进一步检查。
我应该将此记录为 JetBrains 的错误吗?
还是我误会了什么。
我怀疑 R# 正在抱怨,因为它不知道 policy.ProviderID
将 return 两次评估的值相同。考虑:
private readonly int? providerId;
public int? EvilProviderId => DateTime.UtcNow.Second == 0 ? null : providerId;
现在考虑您的代码 - 条件 可能为真,因为第一次调用是在第 59 秒执行的...但是时钟在第二次调用之前滴答作响,然后return null,导致 NullReferenceException
.
如果 是 R# 抱怨的原因,只需提取一个局部变量:
int? providerId = policy.ProviderId;
// Use providerId in both cases in your expression
改用这个:
(policy != null && policy.ProviderID.HasValue && policy.ProviderID. Value > 0) ? RefDataSources.LegalBodies.GetDisplayName(policy.ProviderID.Value) : null
这段代码工作正常:
policy.ProviderID > 0 ? RefDataSources.LegalBodies.GetDisplayName(policy.ProviderID.Value) : null
但 Resharper 抱怨 policy.ProviderID.Value
需要 null
检查(以防止 InvalidOperationException
)。
据我所知,条件只会对大于 0
的非空值计算为真,因此不需要进一步检查。
我应该将此记录为 JetBrains 的错误吗? 还是我误会了什么。
我怀疑 R# 正在抱怨,因为它不知道 policy.ProviderID
将 return 两次评估的值相同。考虑:
private readonly int? providerId;
public int? EvilProviderId => DateTime.UtcNow.Second == 0 ? null : providerId;
现在考虑您的代码 - 条件 可能为真,因为第一次调用是在第 59 秒执行的...但是时钟在第二次调用之前滴答作响,然后return null,导致 NullReferenceException
.
如果 是 R# 抱怨的原因,只需提取一个局部变量:
int? providerId = policy.ProviderId;
// Use providerId in both cases in your expression
改用这个:
(policy != null && policy.ProviderID.HasValue && policy.ProviderID. Value > 0) ? RefDataSources.LegalBodies.GetDisplayName(policy.ProviderID.Value) : null