方法范围中的命名冲突

时间:2016-09-18 09:06:34

标签: c# language-design

  

在一个方法中,只能有一个任何给定名称的对象。我们   使用块级别重用相同的变量名称   然而,在前面的例子中我们的循环控制变量的范围,   块范围之外的同名对象将显示原因   这不起作用。请参阅此示例以显示此命名冲突:

public static void DoWork()
{
    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(i);
    }
    int i = 777; // Compiler error here
    Console.WriteLine(i);
}

以上来自https://www.microsoft.com/net/tutorials/csharp/getting-started/scope-accessibility,我想问为什么会发生这种情况?为什么c#的设计是这样的,因为C ++和Java没有这样的东西。(我已经测试过,在Java和C ++中没有限制)

2 个答案:

答案 0 :(得分:6)

According to Eric Lippert,这个设计选择是为了

  

防止代码的读者/维护者的类错误   被欺骗相信他们指的是一个实体   简单的名称,但实际上是意外地引用另一个实体   完全。

当你重构时,这种事情会特别让你感到困惑,看似无辜的变化可以完全改变代码的含义。

答案 1 :(得分:0)

您在问题开头提到的陈述并非100%正确。

如果您将使用以下代码,编译器将不会生成错误

public static void DoWork()
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine(i);
        }
        { 
          // adding this block will remove the compiler error, 
          // and yes you can use the same variable name in the same 
          // method but you need to help the compiler that each 
          // variable usuage is under its own block.
            int i = 777; // Not compiler error anymore
            Console.WriteLine(i);
        }
    }

您的问题中上面提到的编译器错误很可能是为了防止滥用变量

希望这会对你有所帮助