【C# Error記錄】CS0136:無法在此範圍中聲明名爲“i”的局部變量或參數,因爲該名稱在封閉局部範圍中用於定義局部變量或參數

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章