在VS2017中,如下代码不能通过编译
using System;
using static System.Console;
namespace test
{
class Program
{
static void Main(string[] args)
{
int i = 0;
for(int i = 0; i < 10; i++)
{
WriteLine($"i={i}");
}
ReadKey();
}
}
}
【错误原因】Line3与Line4中都用i作为了变量名,这在C#中是不允许的,虽然他们俩一个在Main()的作用域内,另一个在for循环的作用域内,但是Main()嵌套了for循环,这样的话对于编译器来说两个变量i会产生歧义。
【解决方案】把其中一个变量名作更改即可
下面的例子就没有问题(C#6语法)
using System;
using static System.Console;
namespace test
{
//int i = 0; //错误,命名空间不能直接包含字段或方法之类的成员
class Program
{
int i = 4396; //没问题
static void Main(string[] args)
{
{
int i = 0;//没问题,同级的块中字段可以相同
}
for(int i = 0; i < 10; i++)//没问题,同级的块中字段可以相同
{
WriteLine($"i={i}");
}
Program p = new Program();
WriteLine($"Global i={p.i}");
ReadKey();
}
}
}
运行结果:
i=0
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
Global i=4396
至于为何Program类的成员变量i没有问题,我的理解是:C#中所有变量都是依托于类的,对于一个类来说,作用范围最大的某过于其public修饰的静态成员变量,其次就是普通成员变量了,因此可以把这里的i看作全局变量(至少对这个例子是的),而上述的错误是对于局部变量而言的。(如果这个解释有问题,欢迎在评论区纠正)
注:C++中可以在内层作用域中重新定义外层作用域已有的名字
因此以下C++代码没毛病
#include<iostream>
using namespace std;
int main(){
int i=0;
for(int i=0;i<10;i++){
cout<<"i="<<i<<endl;
}
return 0;
}
有关C++变量作用域可以点击下面的链接了解:
C++作用域