为什么分号而不是空块并不总是有效?

Mec*_*awa 5 c# syntax

我一直在想这个问题。为什么使用分号;而不是空块{}并不总是有效?它使用像语句时,它的工作原理whileforifelse等,但它没有工作trycatchfinallydelegate(可能是不太有用留出空白)。

所以做这样的事情是有效的:

while(shouldIWait()); // This is normal

try {
    doThing(); // Might throw an exception
} catch { } // Ignore the exception
Run Code Online (Sandbox Code Playgroud)

但这不会:

try {
    doThing(); // Might throw an exception
} catch; // Syntax error!
Run Code Online (Sandbox Code Playgroud)

根据我的理解,始终可以使用分号代替空块。为什么这仅限于某些陈述?语句的使用{ };后面的语句之间有真正的区别吗?

Mec*_*awa 1

正如@JeppeStigNielsen 所解释的:

这是 C# 规范所要求的。请参阅第 8 章“声明”。具体来说,if语句(第 8.7.1 节)包含嵌入语句,而try语句(第 8.10 节)包含块。嵌入语句可以是多种事物中的任何一种,其中只有一个是块(8.2)。另一个是空语句(8.3)。有关这些定义,请参阅第 8 章开头。

据我所知,[文档是诸如 等之类的语句ifwhile期望任何类型的嵌入语句。这些是诸如块{ }、空语句;等之类的东西try。语句需要一个块,而不仅仅是任何嵌入的语句(参见第 8 章的开头)。

该文档可以直接从 Microsoft下载,也可以在本地硬盘上找到C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1033\(通过 @JeppeStigNielsen)。