c# – 对于循环计数器变量范围似乎具有双重个性?
参见英文答案 >
Variable scope confusion in C#4个
下面的代码在Visual Studio 2012中生成此错误; “名为’x’的局部变量不能在此范围内声明,因为它会给’x’赋予不同的含义,’x’已在’子’范围内用于表示其他内容” for (int x = 0; x < 9; x++) { //something } int x = 0; 然而.如下修改我得到这个错误; “当前上下文中不存在名称’x’” for (int x = 0; x < 9; x++) { //something } x = 0; 这是一个巨大的矛盾还是我错过了什么? 解决方法
到目前为止,除了Rik之外没有人指出正确的答案.
非常仔细地再次阅读错误消息.他们清楚地解释了错误.第一个错误是:
实际上阅读错误消息.它说使用相同的名称来表示两种不同的东西是非法的.该错误与外部x本身的范围无关;它与x在同一外部范围内用于表示两件事的事实有关. 正如Rik指出的那样,这条规则的目的是避免开发人员对x的含义感到困惑的情况.给定的名称在整个块中几乎总是意味着相同的东西. (有一些细微的例外,但我们今天不要讨论它们.)这条规则还有助于防止在方法中重新排序语句引入的错误,从而巧妙地改变名称的含义.如果名称的含义在块内是不变的,则可以放心地在该块内编辑代码. 许多答案都说不允许范围重叠.对,他们是.不允许局部变量范围重叠,但允许范围重叠.例如: class C { int x; void M() { int y = this.x; for(int x = 0; x < 10; ++x) {} } } 尽管在同一时间范围内有两个叫做x的东西,但是完全合法.但这不合法: class C { int x; void M() { int y = x; // Means this.x for(int x = 0; x < 10; ++x) {} // means local x } } 现在简单的名字x意味着M体内有两个不同的东西,这就是非法的.同样,请确保您理解这一点:使用相同的名称来表示同一范围内的两件事是非法的.重叠范围并不违法. 现在你的第二个错误:
名称x仅在for语句中有效. A声明: for (declarations ; condition ; increment ) body 在逻辑上是等价的(模数中断和继续行为) { declarations; while(condition) { body increment } } 注意外括号.该声明中的任何内容都可以在整个条件,正文或增量中使用,但不在范围之外. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |