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

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