Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 组合空值检查_C#_Null_Resharper_Evaluation - Fatal编程技术网

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中,所以对其进行了改进。