c# - C# 中的局部作用域是如何工作的

标签 c# scope variable-names

<分区>

Possible Duplicate:
Child Scope & CS0136
C# Variable Scoping

虽然我使用 C# 已经有一段时间了,但我只是偶然发现了这个错误。

如果我有以下内容:

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

我收到一条错误消息:无法在此作用域中声明名为“x”的局部变量,因为它会给“x”赋予不同的含义,而“x”已在子作用域中用于表示其他内容.

如果我这样做:

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

我收到一条错误消息:名称“x”在当前上下文中不存在。

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

谢谢。

最佳答案

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

第一个失败是因为在作用域中同时有两个同名的局部变量会造成混淆。

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

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

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

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

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

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

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

关于c# - C# 中的局部作用域是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8933316/

相关文章:

c# - 如何使用 XmlSerializer 和 Autofac 注入(inject)依赖项?

c# - 用 foreach 遍历基数

c# - 重构函数以使其更通用

python - 为什么内部函数不能在python的外部范围内获取变量

c# - 此代码示例中的 @ 是什么意思?

r - 如何使用 dplyr 获取 NSE 中的变量名称

c# - 获取 C# 类中属性的确切类型

javascript - ajax 回调函数的奇怪行为

java - 错误: cannot find symbol

R似乎忽略了下划线之后的变量名部分