在一个方法中,只能有一个任何给定名称的对象。我们 使用块级别重用相同的变量名称 然而,在前面的例子中我们的循环控制变量的范围, 块范围之外的同名对象将显示原因 这不起作用。请参阅此示例以显示此命名冲突:
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 ++中没有限制)
答案 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);
}
}
您的问题中上面提到的编译器错误很可能是为了防止滥用变量
希望这会对你有所帮助