为什么在空的“ while”循环中没有关于空语句可能错误的警告?

rory.ap

左右职位的编译器警告CS0642:“可能弄错空语句”,我了解它的全部。例如,不使用FileStream实例f,因此可能是一个错误:

using (var f = File.OpenRead("f.txt")) ; // Possible mistaken empty statement

但是,即使没有机会永远等于或大于,该while语句也不会发出警告为什么?x3

int x = 1;
while (x < 3) ; // why no warning?

这是一个示例,其中存在警告,但Timer实例t实际上可以执行某些操作,即触发回调:

using (var t = new Timer((x) => Debug.Print("This"), null, 500, 500)) ; // warning

为什么不一致?

杰罗恩·莫斯特(Jeroen Mostert)

没有不一致的地方。CS0642并不是要验证您的代码是否有意义或曾经执行过,它只是旨在捕获可能表示错误的某些语法模式。相比:

int x = 1;
while (x < 3) {}   // no warning
while (x < 3); {}  // CS0642
if (x < 3) ;       // CS0642
using (new object() as IDisposable) ;  // CS0642
using (new object() as IDisposable) {} // no warning
for (; x < 3 ;) ;  // empty statement *and* condition is always true, still no warning

用一个;而不是一个写空循环{ }是程序员带来的一个普遍的C习惯用法(无论好坏)。使这些总是触发CS0642可能会产生太多的误报。using但是,它从来都不是C的习惯用法,因此强制将空块始终写为{ }合理的做法当然,在某些情况下您可能会弄错了:

TextWriter x = null;
using (x) ;  // CS0642
    x.WriteLine();  // whoops, use of disposed object

诚然,这不是一种可能的模式,即使将单个语句包装在块中也始终是一种好习惯,即使在C语言中也是如此。

顺便说一句,如果由埃里克·利珀特(Eric Lippert)决定,那就根本没有;了,{ }到处都是:

空语句功能是多余的,很少需要的并且容易出错,它为编译器团队创建了一项工作,以实现警告您不要使用它的警告。该功能可能只是从C#1.0中删除的。(资源。)

后续问题将是为什么C#编译器没有做出任何明显的努力来警告始终为true或的任何非平凡条件false,这是C编译器的一个相当普遍的功能。编译器针对始终为或的表达式提供一些警告(例如CS0464,“与类型'type'的null进行比较始终会生成'false'”),但不是一般的警告背后可能有一个设计决策,我什至可能曾经见过Eric Lippert博客有关它的信息,或者也许我只是想到了一个。无论如何,没有任何警告都与CS0642无关。truefalse

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么编译器没有警告我有关空的if语句?

为什么可能通过空数组循环

为什么“ if”语句不能在while循环中运行,而while循环中也没有其他事件发生?

为什么 if 语句在 while 循环中阻塞?

为什么在没有赋值的情况下在 javascript 的“for in”循环中初始化空数组?

为什么我面对的是空图而没有任何错误?

为什么while循环后数组为空?

为什么在if分支中出现“可能为空”错误?

为什么在for循环中没有初始化就没有任何警告声明?

为什么空钥匙没有TreeMap的允许?

为什么.NET的DayOfWeek枚举没有空值?

为什么C ++空类没有字节对齐?

为什么在空对象上没有弱类型检测

为什么Visual Studio不警告我有关空引用异常的信息?

为什么NetBeans在此显示有关空指针取消引用的警告?

为什么空列表在Python的while循环中评估为False

为什么没有关于通用接口错误实现的消息

为什么不能在 if 语句中使用空指针?

为什么要使用continue而不是空的if语句?

为什么自定义比较器时出现有关空指针的错误

为什么空循环在Shell脚本中无效?

为什么对数据读取器使用空循环?

为什么循环内的列表在过滤后变为空

为什么增强的for循环不执行空检查

为什么此循环未检测到空指针?

为什么循环后数组似乎是空的?

为什么循环队列中的尾部指向空元素?

为什么这个 for 循环返回一个空列表?

为什么在R中出现“错误:`...不为空”?