【发布时间】:2021-11-18 05:41:50
【问题描述】:
我在 VS Code 中使用以下表达式,我注意到在某些情况下 VS Code 会显示警告。
if(true==null)
{}
else
{}
表达式的结果总是
false,因为值类型bool永远不等于null类型的bool?。
但是,如果我编写以下内容,VS Code 不会抱怨。
if(new Foo()==null)
{}
else
{}
Foo 是一个类。
问题
为什么上面的表达式不产生The result of the expression is always false ...?
【问题讨论】:
-
是否保证
new Foo()总是返回非空引用? -
撇开诸如重载运算符之类的奇特事物不谈,通常 C# 编译器实际上并不会非常努力地确定条件始终为
true或false,只是基础知识。例如int x = 0; if (x < 3) { Console.WriteLine(...); }和x是本地的也不会触发任何警告,即使(例如)几乎所有 C 编译器都会发出警告。 -
@JeroenMostert 这正是静态分析器工具介入并告诉用户“嘿,您将此值分配给变量并且从不更改它。将其设为常量,或仅输入值你在任何地方都在使用它你!”
-
@Logarr:当然,除了编译器按定义执行静态分析,所以几乎所有的编译器也会检测到这样的事情。专用的静态分析工具往往会更进一步,检测编译器中没有内置的东西(出于速度的原因,或者因为错误不常见或不够清晰,如果你不是执行主观的“最佳实践”)。 C# 编译器在这里的不同寻常之处在于它甚至无法检测到使用无意常量的最简单情况。
标签: c#