M.k*_*ary 24 c# scope for-loop
我编码时遇到了这种奇怪的行为.所以我在这里问.
for声明变量时循环的范围是什么?
这段代码编译得很好
for (int i = 0; i < 10; i++) { }
for (int i = 0; i < 10; i++) { }
Run Code Online (Sandbox Code Playgroud)
这意味着两者int i的范围不同.
但是这段代码没有编译.
for (int i = 0; i < 10; i++) { }
int i; // Conflicts with both first loop and second one.
for (int i = 0; i < 10; i++) { }
Run Code Online (Sandbox Code Playgroud)
这意味着int i循环中间具有与第一循环和第二循环相同的范围.
但是int i在两个for循环中如何才能有不同的范围,但中间的范围相同int i?因为目前我看到他们处于同一水平.
我知道第二个代码没有编译.如果范围存在问题,为什么第一个代码会编译.这是编译器内部的异常吗?
Kap*_*pol 24
C#编译器不检查变量是在另一个变量之前还是之后声明.重要的是范围.i循环之间声明的变量肯定与第二个循环冲突,因为如果你i在循环中使用,则无法区分i你想要使用的变量.对于第一个循环,仍然会显示错误,因为i声明的块也封装了第一个循环.
例如,以下内容不会编译,即使j在内括号外部不可见,因此不应该有任何歧义i:
{
{
int i = 1;
int j = 1;
}
int i = 0; // compiler error: A local variable i cannot be declared in this scope (...)
// j is not visible here
}
Run Code Online (Sandbox Code Playgroud)
编辑评论:
为什么以下罚款?
{
for(int i = 1; i < 10; i++) {}
for(int i = 1; i < 10; i++) {}
}
Run Code Online (Sandbox Code Playgroud)
声明for循环变量时,它仅在循环块内可见.这意味着两个变量的范围是不相交的,因为没有代码行,其中一个块"重叠"另一个块.
for循环的范围for(INIT; COND; INCR) { BLOCK }在范围界定方面是相同的
{
INIT;
while (COND) {
BLOCK;
INCR;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,for循环可以最好地被认为是两个嵌套的范围. (注:上述折算for到while不正确采集的行为continue.然而,这个问题是没有专注于这一点.)
你int i在for循环外部遇到的问题就是所谓的"阴影".在C++中,如果您声明了一个与外部作用域中的某个名称相同的作用域变量,那么您"隐藏它",默默地覆盖它直到作用域结束.当他们开发C#时,他们觉得这太违反直觉了,而且容易出错.在C#中,从外部作用域遮蔽变量是一种语法错误.通过引入int i外部范围,for循环自身引入它现在是非法的.
| 归档时间: |
|
| 查看次数: |
3060 次 |
| 最近记录: |