有吨左右职位的编译器警告CS0642:“可能弄错空语句”,我了解它的全部。例如,不使用该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
为什么不一致?
没有不一致的地方。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无关。true
false
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句