C#有效语法(IF语句中的变量声明,不带括号)

本文关键字:声明 变量 语法 有效 IF 语句 | 更新日期: 2023-09-27 18:22:01

我有一个简单的问题,似乎无法理解。

为什么这是有效的c#:

if (node != null)
{
     string fullAddress = node.InnerText;
}

这不是吗?

if (node != null)
     string fullAddress = node.InnerText;

这是编译器中的错误吗?

C#有效语法(IF语句中的变量声明,不带括号)

因为您定义的是一个没有封闭作用域的局部变量。

好吧,msdn说这个

允许在块中声明语句,但不允许作为嵌入语句。

当您编写不带大括号的if时,编译器将单个语句视为大括号,因此:

if (node != null)
     string fullAddress = node.InnerText;

基本上变成了:

if (node != null)
{
     string fullAddress = node.InnerText;
}

但是,请注意,fullAddress的作用域仅在大括号内,因此永远不能使用该变量。编译器足够聪明,知道这一点,所以它将其标记为错误,因为它知道没有一个理智的程序员会这样做。:)

我认为这实际上是.NET编译器中的一个常见主题——他们有很多健全性检查,以确保你不会做一些没有意义的事情,并且通常会根据各种代码模式优化它们的输出。

这是预期的行为,如果您记得if接受一个语句,这是有意义的,所以如果允许这样的语法,变量声明的范围将在声明后立即结束。

C#5.0规范第8.5节中包含的详细信息(感谢Rob Harvey的链接)和第B.2.5节中的语法:

第8.5节:

声明语句声明局部变量或常量。允许在块中使用声明语句,但不允许将其作为嵌入语句。

第B.2.5节语法:

statement:
  labeled-statement
  declaration-statement
  embedded-statement
embedded-statement:
  block 
  ...
if-statement:
   if   (   boolean-expression   )   embedded-statement

正如您所看到的,变量声明(declaration-statement)不是embedded-statement,因此不能在if-statement中使用。

C#规范位置注释:

  • 旧版本可以在MSDN上在线找到(即上面提到的Anirudh答案中的第8.5节)
  • 最新版本随VS安装而来,通常位于"Program Files(x86)''Microsoft Visual Studio 11.0''VC#''Specifications''1033''CSharp Language Specification.docx"文件夹中。另请参阅在哪里可以找到C#5语言规范
if (node != null)
  string fullAddress = node.InnerText;

这是Visual basic的代码编写风格,您不必使用括号。此外,在C#中,如果我们不加括号,则只执行一行语句。然而,如果我们需要执行更多的代码行,那么我们将不得不使用括号。