3

为什么如果我用 C# 写这个:

for(int myVar = 0; myVar<10; myVar++)
{
//do something here
}

//then, if I try:
int myVar = 8;
//I get some error that the variable is already declared.

//but if I try:
Console.WriteLine(myVar);
//then I get the error that the variable is not declared.

我最常说的有点令人困惑。有谁知道为什么 C# 编译器会这样做?

4

4 回答 4

6

此规则以及其他一些相关规则在Eric Lippert 的这篇博文中进行了讨论。

这里违反的特定规则是:

2) 在同一个局部变量声明空间或嵌套的局部变量声明空间中有两个同名的局部变量是非法的。

特别值得注意的是,关于规则存在的原因是以下段落:

所有这些规则的目的是防止代码的阅读者/维护者被欺骗认为他们指的是一个具有简单名称的实体,但实际上是不小心完全引用了另一个实体的错误类。这些规则特别设计用于在执行应该是安全的重构时防止令人讨厌的意外。

通过允许您所描述的内容,它可能会导致看似良性的重构,例如将for循环移动到另一个声明之后,从而导致截然不同的行为。

于 2013-04-30T19:07:47.387 回答
1

不能在此范围内声明名为“myVar”的局部变量,因为它会给“myVar”赋予不同的含义,“myVar”已在“子”范围内用于表示其他内容。

两个变量都在同一范围内声明。(一个在子范围内仍然不允许您声明它两次)您不能再次声明该变量。
更改范围将允许您再次声明它。

private void myMethod()
{
   //Start of method scope 

   for (int myVar = 0; myVar < 10; myVar ++)
   {
      //Start of child scope
      //End of child scope
   }

   //End of method scope
}

private void anotherMethod()
{
   // A different scope 
   int myVar = 0 
}
于 2013-04-30T19:10:21.220 回答
0

您所指的错误already declared具有很强的描述性,并说...

不能在此范围内声明名为“myVar”的局部变量,因为它会给“myVar”赋予不同的含义,“myVar”已在“子”范围内用于表示其他内容

myVar当您第二次尝试使用它时,实际上并没有“声明”。

于 2013-04-30T19:07:46.510 回答
0

看起来很奇怪,但 C# 提供了通过简单地使用一些大括号来分隔一些代码行,如下所示:

for(int myVar = 0; myVar<10; myVar++)
{
//do something here
}

{
   //then, if I try:
   int myVar = 8;
   //I get some error that the variable is already declared.

   //but if I try:
   Console.WriteLine(myVar);
   //then I get the error that the variable is not declared.
}
于 2013-04-30T19:09:08.317 回答