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.

我可以理解其中的一个,但为什么这两个都存在?有办法绕过第一个选项吗?我觉得这很烦人。

谢谢。

C#中的本地作用域是如何工作的

这两个错误的存在都是为了防止你犯错误或让你的同事想杀了你。

第一种方法失败了,因为同时在作用域中有两个名称相同的局部变量是令人困惑的。

第二个失败,因为变量的作用域是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不存在,因为它只在{ } 内部定义