不能在方法中使用相同的变量名

rad*_*byx 3 c# methods

为什么我不能index在方法中使用相同的变量名?

为什么编译器看不到不同,何时我能清楚?

例:

private void Foo()
{
    for (int index = 0; index < 10; index++) // "first"-index
    {
         // I'm in no doubt, use "first"-index here 
         // (and only within the scope of the for loop)
    }
    int index = 0; // "second"-index
    // I'm in no doubt, use "second"-index here 
    // (and below)
}
Run Code Online (Sandbox Code Playgroud)

是因为分配是在编译时进行的吗?但是,为什么编译器在引擎盖下只调用index_1的"第一"索引和index_2的"第二"索引?

如果我有

    private void Foo()
    {
        for (int index = 0; index < 10; index++)
        {
        }
        // the runtime don't know index here
    }
Run Code Online (Sandbox Code Playgroud)

如果运行时不知道for循环下面的索引,为什么我们不能有另一个具有该名称的变量?

Cod*_*aos 6

即使范围没有,这些变量的声明空间也会重叠.检查Eric Lippert关于该主题的博客:

简单的名字并不那么简单

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

区别是什么,第二部分:范围与宣言空间与生命时间

相反,声明空间是程序文本的一个区域,其中不允许两个实体具有相同的名称.

变量的声明空间大于其范围,以防止这些误导性情况.


Eri*_*ert 6

CodeInChaos基本上是正确的,链接的文章解释了您违反的规则.

你问为什么编译器无法看到差异,但你可以.一个奇怪的问题:显然编译器可以看到差异.如果编译器无法解决"索引"这两个含义之间的差异,那么它怎么能正确产生错误呢?错误是有两个东西意味着不同但名称相同的东西,因此编译器当然知道它们是不同的.正是因为编译器知道"索引"的两个含义是不同的,才能使它正确地给出错误.

继续.

有两个本地变量意味着不同的东西是一个坏的做法,使得错误,这就是为什么有规则,以防止它.如果你真的想这样做,你可以但是你需要确保它们的声明空格不重叠.你可以通过引入额外的括号来做到这一点:

{
    {
        int index; 
        // blah blah blah
    }  
    {
        int index;
        // blah blah blah
    }
}
Run Code Online (Sandbox Code Playgroud)

因为现在没有声明"index"的空间并且意味着两个不同的东西.(显然,最外局部声明空间是其中"指数"是指两个不同的东西,但索引不声明在外部声明空间.)

"for"和"foreach"循环被视为围绕整个事物具有隐形括号,因此这是合法的:

{
    for(int index = 0; index <= 10; ++index) {...}
    for(int index = 0; index <= 10; ++index) {...}
}
Run Code Online (Sandbox Code Playgroud)

编译器假装你实际写了

{
    {
        int index = 0; 
        while(index <= 10) { ... }
    }
    {
        int index = 0; 
        while(index <= 10) { ... }
    }
}
Run Code Online (Sandbox Code Playgroud)

同样,"隐形"括号使两个局部变量声明保持文本分离.