C#中的本地作用域是如何工作的
本文关键字:何工作 工作 作用域 | 更新日期: 2023-09-27 18:21:03
可能重复:
子作用域&CS0136
C#变量范围
尽管我已经使用C#很长一段时间了,但我还是偶然发现了这个错误。
如果我有以下内容:
if(true)
{
int x = 0;
}
int x = 0;
我收到一个错误,上面写着:A local variable named 'x' cannot be declared in this scope because it would give a different meaning to 'x', which is already used in a child scope to denote something else.
如果我这样做:
if(true)
{
int x = 0;
}
x = 0;
我收到一个错误,上面写着:The name 'x' does not exist in the current context.
我可以理解其中的一个,但为什么这两个都存在?有办法绕过第一个选项吗?我觉得这很烦人。
谢谢。
这两个错误的存在都是为了防止你犯错误或让你的同事想杀了你。
第一种方法失败了,因为同时在作用域中有两个名称相同的局部变量是令人困惑的。
第二个失败,因为变量的作用域是if
语句,而您正试图在该作用域之外访问它。
如果你想要一个可以在块内外使用的变量,你只需要在块之前声明它:
int x;
if (true)
{
x = 0;
}
x = 0;
如果您确实希望两个单独的变量同时在作用域中(在块中),那么为它们指定不同的名称,从而避免以后混淆。
EDIT:可以在一个方法中声明多个具有相同名称的局部变量,但它们必须具有单独的作用域。例如:
public void Foo(IEnumerable<string> values)
{
double sum = 0;
foreach (string x in values)
{
int z = x.Length;
sum += z;
}
foreach (string x in values)
{
double z = double.Parse(x);
sum += z;
}
}
就我个人而言,当变量具有有意义的名称且方法较短时,我不倾向于经常使用这种功能,至少在不同类型的情况下不会。但它是绝对合法的,有时肯定有用。
在第一种情况下,问题是{ }
块外的int x
具有一个全局作用域,该全局作用域包含{ }
内的上下文;因此,您正在重新声明一个具有相同名称的变量。
在第二种情况下;x
不存在,因为它只在{ }
内部定义