【发布时间】:2018-08-08 14:08:32
【问题描述】:
关于compiler warning CS0642: "Possible mistaken empty statement" 的帖子有吨,我了解它的全部内容。例如,FileStream 实例 f 没有被使用,所以这可能是一个错误:
using (var f = File.OpenRead("f.txt")) ; // Possible mistaken empty statement
然而,这个while 语句不会产生警告,即使x 没有机会变得等于或大于3。为什么?
int x = 1;
while (x < 3) ; // why no warning?
这是一个存在警告但 Timer 实例 t 实际上可以做某事的示例,即触发回调:
using (var t = new Timer((x) => Debug.Print("This"), null, 500, 500)) ; // warning
为什么不一致?
【问题讨论】:
-
关于while,也可以这样做:while(true)
-
关于计时器,我认为警告是关于'x'
-
将此称为“不一致”似乎是不诚实的。您是否希望编译器具有
Timer的领域知识?这是一个警告而不是错误的全部原因是因为编译器不确定。 “为什么编译器不对始终为真的while条件发出警告”(即“x”示例)是一个有效但独立的问题。 -
CS0642 实际上非常聪明,因为它似乎旨在捕捉明显的 typographical 错误而不是 semantic 错误:
while (x < 3) ;不会触发警告,但while (x < 3); { ... }确实。我猜while (always-true-condition) ;经常出现在有效代码中,以至于它被排除在外(无论如何,它需要进行不同类型的检查)。 -
还要注意
using (...) {}也不会触发警告——空的blocks 在任何情况下都可以,因为你显然没有错别字。空块可能仍然是一个错误,但 CS0642 不在乎。 (这也解释了为什么我不记得在最近的记忆中见过它——我从不在会出现阻塞的地方使用单独的;。)
标签: c# visual-studio visual-studio-2017 compiler-warnings