C# · 12月 27, 2021

为什么C#不允许我在不同的范围内使用相同的变量名?

例如: if ( this.IsValid ){ Matrix matrix = new Matrix();}Matrix matrix = new Matrix();

编译器警告我说:

“名为”matrix“的局部变量不能在此范围内声明,因为它将给”matrix“带来不同的含义,”matrix“已经在”child“范围中用于表示别的东西.

这些变量不是不同的范围,所以我无法从if语句外部访问第一个矩阵?

解决方法 迄今给出的答案非常混乱.对问题的正确分析从阅读错误信息开始.错误信息告诉您实际出错:

“A local variable named ‘matrix’ cannot be declared in this scope because it would give a different meaning to ‘matrix’,which is already used in a ‘child’ scope to denote something else.

仔细阅读它正在告诉你C#的哪个规则被违反,即你不允许使用相同的名称来引用同一范围内的两个不同的东西. (实际上,错误信息稍微有些错误,应该说“局部变量声明空间”,它表示“范围”,但这是很冗长的.)

该规则记录在C#4.0规范中,第7.6.2.1节:简单名称,块中的不变含义.

(在重叠的声明空间中有两个同名的局部变量也是非法的,编译器也可以报告错误,但是在这种情况下报告更常见的错误.)

Aren’t these variables in different scopes,so I wouldn’t be able to access the first matrix from outside the if statement anyway?

是.这个说法是真实的,但并不相关.这里的错误是使用相同的简单名称来引用同一个局部变量声明空间中的两个不同的东西.

考虑这种情况:

class C { int x; void M() { x = 10; // means “this.x” for(whatever) { int x = whatever; } } }

相同的交易这里的错误是在外部声明空间中使用简单的名称“x”来引用this.x,并且在内部声明空间中使用的是“局部变量”.使用相同的简单名称来引用同一声明空间中的两个不同的东西 – 记住,内部声明空间是外部声明空间的一部分 – 既混淆又危险,因此是非法的.

明显的原因令人困惑有一个合理的期望,一个名字将意味着在其首次使用的整个声明空间中的任何地方相同的东西.这是很危险的,因为小代码编辑容易改变意义:

class C { int x; void M() { int x; x = 10; // no longer means “this.x” for(whatever) { x = whatever; } } }

如果首先使用简单名称的声明空间不重叠,那么简单名称引用不同的东西是合法的:

class C { int x; void M() { { x = 10; // means “this.x” } for(whatever) { int x = whatever; // Legal; Now the } } }

有关更多信息,以及有关油炸食品的有趣故事,请参阅

http://blogs.msdn.com/b/ericlippert/archive/tags/simple+names/