public class MyTest : ITest { int a = 3; int b=7; public void Test() { a = 99; Console.WriteLine(a); for (int a = 0; a < 3; a++) { Console.WriteLine(a); }
}
}
这个for语句块里面报错, 错误 1 不能在此范围内声明名为“a”的局部变量,因为这样会使“a”具有不同的含义,而它已在“父级或当前”范围中表示其他内容了我
我自己理解是字段a的作用域是整个类,我在任何地方都可以访问。在for语句块里声明的局部变量会把它覆盖掉。在Test里面,我加上this去访问a是不会报错的。
各位大神们,我想知道这个错误的依据是什么?小弟,谢谢各位大神
上面的答案说的有点模棱两可。字段的作用域在整个类中,如果方法中参数同名,此时可以通过this.字段去访问。for语句块中的变量作用域就在语句块中。我们知道如果在方法中定义一个变量a此时会和语句块中的变量冲突。在语句块前后输出a得到的错误也不一样,记住不能这样用就好了
其实,并不会报错...
为啥啊?编译器报错了
@周岩:
特意写来测量一下
@米修君:反正我的上面是报错了
a变量名重复定义了,你在for语句循环中定义了局部变量a,这会导致你的 Console.WriteLine(a)中的a不明确,如果你加了Console.WriteLine(this.a),编译器就会知道你引用的是结构体中定义的a,这样定义是不好的,不要在方法中定义一个有歧义的变量名。
小伙子净折腾这些没用的东西。
编译器报错误的依据是,这个 编程语言的 编译准则。
在JavaScript中就不会报,为啥,因为JavaScript的编译器 没有这样子的准则,而C#就有
@米修君: 自己偶然想到的,知道正确的做法。
作用域的问题,每一级都有作用域的。在for循环里的a的生命周期只在for里,出了循环就被释放了。
如果你定义一个全局变量a,然后再main函数中定义了一个局部变量,优先使用main函数中的变量,如果要使用全局变量在变量前面加::作用域限定符即可