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

时间:2013-07-10 16:27:21

标签: c# syntax compiler-errors

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

为什么这是有效的c#:

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

这不是吗?

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

这是编译器中的错误还是这个?

5 个答案:

答案 0 :(得分:7)

因为您正在定义一个没有封闭范围的局部变量。

答案 1 :(得分:5)

msdn说这个

  

声明语句在块中是允许的,但是不允许   作为嵌入式陈述。

答案 2 :(得分:3)

当您编写一个没有大括号的if时,编译器会将单个语句视为大括号,因此:

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

基本上变成了:

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

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

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

答案 3 :(得分:2)

这是预期的行为,如果你记得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上在线找到(即上面提到的Section 8.5来自Anirudh回答)
  • 最新附带VS安装,通常位于“Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC#\ Specifications \ 1033 \ CSharp Language Specification.docx”文件夹中。另请参阅Where can I find the C# 5 language specification?

答案 4 :(得分:0)

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

这是代码编写的Visual基本样式,您不必使用括号。另外,在C#中,如果我们不给括号,则只执行一行语句。但是,如果我们需要执行多行代码,那么我们将不得不使用括号。