首页 新闻 会员 周边 捐助

关于变量的作用域问题

0
悬赏园豆:20 [已解决问题] 解决于 2016-01-12 09:55
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是不会报错的。
各位大神们,我想知道这个错误的依据是什么?小弟,谢谢各位大神

周岩的主页 周岩 | 初学一级 | 园豆:197
提问于:2016-01-06 11:20
< >
分享
最佳答案
0

上面的答案说的有点模棱两可。字段的作用域在整个类中,如果方法中参数同名,此时可以通过this.字段去访问。for语句块中的变量作用域就在语句块中。我们知道如果在方法中定义一个变量a此时会和语句块中的变量冲突。在语句块前后输出a得到的错误也不一样,记住不能这样用就好了

周岩 | 初学一级 |园豆:197 | 2016-01-12 09:54
其他回答(4)
0

其实,并不会报错...

收获园豆:5
米修君 | 园豆:553 (小虾三级) | 2016-01-06 12:23

为啥啊?编译器报错了

支持(0) 反对(0) 周岩 | 园豆:197 (初学一级) | 2016-01-06 13:20

@周岩: 
特意写来测量一下

支持(0) 反对(0) 米修君 | 园豆:553 (小虾三级) | 2016-01-06 14:22

@米修君:反正我的上面是报错了

支持(0) 反对(0) 周岩 | 园豆:197 (初学一级) | 2016-01-07 14:08
0

a变量名重复定义了,你在for语句循环中定义了局部变量a,这会导致你的 Console.WriteLine(a)中的a不明确,如果你加了Console.WriteLine(this.a),编译器就会知道你引用的是结构体中定义的a,这样定义是不好的,不要在方法中定义一个有歧义的变量名。

收获园豆:5
Leon719 | 园豆:214 (菜鸟二级) | 2016-01-06 14:17
0

小伙子净折腾这些没用的东西。

 

编译器报错误的依据是,这个 编程语言的 编译准则。

在JavaScript中就不会报,为啥,因为JavaScript的编译器 没有这样子的准则,而C#就有

收获园豆:5
需要格局 | 园豆:2145 (老鸟四级) | 2016-01-06 16:06

@米修君: 自己偶然想到的,知道正确的做法。

支持(0) 反对(0) 周岩 | 园豆:197 (初学一级) | 2016-01-07 14:07
0

作用域的问题,每一级都有作用域的。在for循环里的a的生命周期只在for里,出了循环就被释放了。

 

如果你定义一个全局变量a,然后再main函数中定义了一个局部变量,优先使用main函数中的变量,如果要使用全局变量在变量前面加::作用域限定符即可

收获园豆:5
showonce | 园豆:112 (初学一级) | 2016-01-06 16:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册