6

可能重复:
子范围和 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.

我可以理解有一个或另一个,但为什么这两个错误都存在?有没有办法绕过第一个选项?我觉得很烦人。

谢谢。

4

2 回答 2

6

这两个错误的存在都是为了阻止你犯错误或导致你的同事想要杀了你。

第一个失败是因为一次在范围内有两个同名的局部变量会令人困惑。

第二个失败,因为变量的范围是if语句,并且您试图在该范围之外访问它。

如果你想要一个可以在块内部和外部使用的变量,你只需要在块之前声明它:

int x;
if (true)
{
    x = 0;
}
x = 0;

如果您实际上希望两个单独的变量同时在范围内(在块内),那么给它们不同的名称 - 从而避免以后的混淆。

编辑:您可以在一个方法中声明多个具有相同名称的局部变量,但它们必须具有单独的范围。例如:

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;
    }
}

就我个人而言,当变量具有有意义的名称并且方法很短时,我不倾向于经常使用这种能力 - 至少不会使用不同的类型。但它绝对是合法的,而且有时肯定会很有用。

于 2012-01-19T21:12:25.553 回答
3

在第一种情况下,问题在于您int x的块外部{ }具有将上下文封闭在内部的全局范围{ };因此,您正在重新声明一个具有相同名称的变量。

在第二种情况下;x不存在,因为它仅在内部定义{ }

于 2012-01-19T21:12:10.973 回答