C# 组合空值检查
此代码工作正常:C# 组合空值检查,c#,null,resharper,evaluation,C#,Null,Resharper,Evaluation,此代码工作正常: policy.ProviderID > 0 ? RefDataSources.LegalBodies.GetDisplayName(policy.ProviderID.Value) : null 但是Resharper抱怨需要检查policy.ProviderID.Value是否为null(以防止无效操作异常) 据我所知,对于大于0的非空值,条件将仅计算为true,因此无需进一步检查 我应该把它作为一个bug记录在JetBrains上吗? 或者我误解了什么。我怀疑R#在
policy.ProviderID > 0 ? RefDataSources.LegalBodies.GetDisplayName(policy.ProviderID.Value) : null
但是Resharper抱怨需要检查policy.ProviderID.Value
是否为null
(以防止无效操作异常
)
据我所知,对于大于0
的非空值,条件将仅计算为true,因此无需进一步检查
我应该把它作为一个bug记录在JetBrains上吗?
或者我误解了什么。我怀疑R#在抱怨,因为它不知道策略。ProviderID
将在两个计算中返回相同的值。考虑:
private readonly int? providerId;
public int? EvilProviderId => DateTime.UtcNow.Second == 0 ? null : providerId;
现在考虑你的代码——条件可能是正确的,因为第一个调用是在第二个59上执行的…但是,在第二次调用之前,时钟会滴答作响,然后返回null,导致
NullReferenceException
如果这就是R#抱怨的原因,只需提取一个局部变量:
int? providerId = policy.ProviderId;
// Use providerId in both cases in your expression
我怀疑R#在抱怨,因为它不知道policy.ProviderID
将在两个计算中返回相同的值。考虑:
private readonly int? providerId;
public int? EvilProviderId => DateTime.UtcNow.Second == 0 ? null : providerId;
现在考虑你的代码——条件可能是正确的,因为第一个调用是在第二个59上执行的…但是,在第二次调用之前,时钟会滴答作响,然后返回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 != null && policy.ProviderID.HasValue && policy.ProviderID. Value > 0) ? RefDataSources.LegalBodies.GetDisplayName(policy.ProviderID.Value) : null
什么样的政策。ProviderID?@Matt显然
int?
@IvanStoev,你是怎么得出这个结论的?我看不到任何东西可以证实它是那种类型的。@AshBurlaczenko:看起来它是某种数值类型的可空值类型,以便与0进行比较。我同意肯定知道会很好,但我认为目前这是一个合理的猜测。@JonSkeet,我在扮演魔鬼代言人:)我同意吗?很可能是那种类型,我只是指出还有其他的可能性。什么是政策类型。ProviderID?@Matt显然int?
@IvanStoev,你是怎么得出这个结论的?我看不到任何东西可以证实它是那种类型的。@AshBurlaczenko:看起来它是某种数值类型的可空值类型,以便与0进行比较。我同意肯定知道会很好,但我认为目前这是一个合理的猜测。@JonSkeet,我在扮演魔鬼代言人:)我同意吗?很可能是那种类型,我只是指出还有其他的可能性。什么,所有这些只是为了让ReSharper开心?如果属性在调用之间没有发生变化,那么操作代码是完全正确的,但是如果发生了变化,您的代码片段也将无法工作。什么,所有这些都只是为了让ReSharper高兴?如果属性在调用之间没有发生变化,那么操作代码是完全正确的,但是如果发生了变化,您的代码片段也将无法工作。但是,是否将其更改为var t=p.ProviderID.HasValue?(int?)p.ProviderID.Value:空代码>删除警告,但仍然容易受到您概述的情况的影响。这可能是因为R#没有将int?
与任何其他Nullable
区分开来,而T
可能会使运算符过载。有趣的是,更进一步,你提取局部变量的修复实际上也删除了警告。我模糊地想到了这一点,但如果“>0”检查被替换(或补充)为“!=null”,那么Resharper会删除警告,所以我想一定是其他原因。@SimonHewitt:我怀疑启发式方法相当复杂。。。我建议还是使用“提取局部变量”版本吧。这次我一定在Resharper网站上使用了更好的关键字,因为我发现这个问题已经在网站上报道过了。问题仍然存在于我刚刚安装的v10中,所以我对它进行了改进。我在本地得到了相同的行为。但是,是否将其更改为var t=p.ProviderID.HasValue?(int?)p.ProviderID.Value:空代码>删除警告,但仍然容易受到您概述的情况的影响。这可能是因为R#没有将int?
与任何其他Nullable
区分开来,而T
可能会使运算符过载。有趣的是,更进一步,你提取局部变量的修复实际上也删除了警告。我模糊地想到了这一点,但如果“>0”检查被替换(或补充)为“!=null”,那么Resharper会删除警告,所以我想一定是其他原因。@SimonHewitt:我怀疑启发式方法相当复杂。。。我建议还是使用“提取局部变量”版本吧。这次我一定在Resharper网站上使用了更好的关键字,因为我发现这个问题已经在网站上报道过了。问题仍然存在于我刚刚安装的v10中,所以对其进行了改进。