方法作用域中的命名冲突

本文关键字:冲突 作用域 方法 | 更新日期: 2023-09-27 18:07:21

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

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++和Java没有这样的东西,为什么c#要这样设计呢。(我已经测试过了,在Java和C++中没有限制(

方法作用域中的命名冲突

根据Eric Lippert的说法,这种设计选择是为了

防止代码的读取器/维护器出现错误被诱骗相信他们指的是一个具有简单的名称,但实际上是意外地引用了另一个实体完全

当重构时,这种事情会特别折磨你,而看似无辜的更改可能会完全改变代码的含义。

您在问题开头提到的陈述并非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);
        }
    }

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

希望这将帮助您