0

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

为什么这是有效的 c#:

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

这不是吗?

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

这是编译器中的错误还是有意的?

4

5 回答 5

7

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

于 2013-07-10T16:29:27.783 回答
5

msdn这么说

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

于 2013-07-10T16:32:53.290 回答
4

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

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

基本上变成了:

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

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

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

于 2013-07-10T16:31:57.590 回答
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 上在线找到(即上面提到的来自 Anirudh 答案的第 8.5 节)
  • 最新版本附带 VS 安装,通常位于“Program Files (x86)\Microsoft Visual Studio 11.0\VC#\Specifications\1033\CSharp Language Specification.docx”文件夹中。另请参阅在哪里可以找到 C# 5 语言规范?
于 2013-07-10T16:35:20.057 回答
0
if (node != null)
  string fullAddress = node.InnerText;

这是无需使用括号的 Visual basic 代码编写风格。此外,在 C# 中,如果我们不给出括号,则只会执行一行语句。但是,如果我们需要执行多行代码,那么我们将不得不使用括号。

于 2013-07-10T16:47:01.177 回答