【发布时间】:2016-09-29 05:52:27
【问题描述】:
我有这个代码:
Assert.IsTrue(datasetMetadata1 != null && datasetMetadata1.Length == 5);
Assert.IsTrue(datasetMetadata2 != null && datasetMetadata2 .Length == 11);
if ((datasetMetadata1 == null || datasetMetadata1.Length != 5) ||
(datasetMetadata2 == null || datasetMetadata2 .Length != 11)
{
/* do something */
}
ReSharper 通过删除冗余(因为总是 true)表达式 == null 并将 if 语句反转为类似于以下内容来简化:
if ((datasetMetadataPunktort.Length == 5) && (datasetMetadataFlurstueck.Length == 11))
return
但是对我来说,即使这个检查似乎也毫无意义,并且很容易被忽略,因为条件总是正确的。所以我想知道为什么 ReSharper 会检测到针对 null 的过时检查,而不是其余的。
我是否遗漏了任何检查失败的情况?
【问题讨论】:
-
Resharper 应该如何知道 Length 在运行时会有什么值?
-
@j0ey_wh 嗯,公平点。它无法知道属性是否不可变,这就是您的意思,不是吗?
-
也许如果你引入一个长度的变量它会注意到吗?
-
@Euphoric 不,即使将
Length存储到变量中并将其用于Assert和 if 语句 R# 也不会注意到它们是相等的条件。 -
在我看来,事情是这样的:每次测试你的值时,你都会调用 getter。 Resharper 不知道您的实际 getter 是否修改了您的值。您第一次调用 getter 时可能会返回 5 并将值增加 6。所以下次您将返回 11。
标签: c# visual-studio-2010 resharper-2016