在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++作用域