为什么C#允许这个有趣? ; ; ; ;

看我下面的代码

protected void Page_Load(object sender, EventArgs e) { ExistsOnPath("efsui.exe"); ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; install(); ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; } 

我在visual studio中添加了更多的分号符号。 为什么visual studio允许这个? 这是错的还是正确的?

看到这个图像和红色标记。 构建成功

在此处输入图像描述

但错误显示在这一行?

 webClient.DownloadFile("http://www.who.int/inf-new/dnldtxt/introductions.zip", "";;;;;;;;;;;;;;;;); 

在此处输入图像描述

另一个有趣的是,下面的一行是成功的

 private void install() { http://www.stackoverflow.com return; } 

因为分号; 是一个有效的空语句

8.3空话

空语句什么都不做。

空语句:

;

如果在需要语句的上下文中没有要执行的操作,则使用空语句。

执行空语句只是将控制转移到语句的结束点。 因此,如果可以访问空语句,则可以访问空语句的结束点。

另请参阅: 语句(C#编程指南) – MSDN

空语句由单个分号组成。 它什么都不做,可以在需要声明但不需要执行任何操作的地方使用。

编辑:

 webClient.DownloadFile("http://www.who.int/inf-new/dnldtxt/introductions.zip", ;;;;;;;;;;;;;;;;""); 

但为什么错误显示在这一行?

好吧 分号是一个有效的空语句,但这并不意味着您可以将它放在代码中的任何位置。 DownloadFile方法需要两个参数,你可以在其中放置任何语句,如:

 webClient.DownloadFile("http://www.who.int/inf-new/dnldtxt/introductions.zip", Console.Write("Some Text");, ""); 

Console.Write本身是一个有效的语句,但它不能用于参数。

为什么这段代码编译:

 private void install() { http://www.stackoverflow.com return; } 

因为它将http:作为Labeled语句处理,并且冒号后的任何内容都被视为标签文本的一部分。 上面的代码会产生警告

此标签尚未引用

; 可以在C#语言中用作空语句。 因此有很多; 连续就好了,因为它只是一系列空语句。 基本上是无操作

请注意,这不是Visual Studio行为,而是C#语言行为。 与VB.Net等其他语言相同的代码会产生编译错误

它成功,因为每个以分号结尾的语句都没有任何语法错误; 他们是空的。 现在,就生成的代码而言,不会为这些语句生成任何内容。

为了更好地理解它,您可能想要研究解析器的工作原理。