c# - for 循环中计数器变量的范围是什么?

标签 c# c scope

我在 Visual Studio 2008 中收到以下错误:

错误 1 ​​无法在此作用域中声明名为“i”的局部变量,因为它会给“i”赋予不同的含义,而“i”已在“子”作用域中用于表示其他内容

这是我的代码:

for (int i = 0; i < 3; i++)
{
  string str = "";
}

int i = 0; // scope error
string str = ""; // no scope error

我知道一旦循环终止 str 就不再存在,但我也认为 i 的范围仅限于 for循环也是如此。

所以 i 与在 for 循环外声明的变量具有相同的作用域?

编辑:

需要说明的是,我使用的是 C#。我正在讨论删除“C”标签。然而,由于正确答案解释了两者之间的区别,我认为保留两个标签是有意义的。

我在上面的代码注释中有一个错误:

for (int i = 0; i < 3; i++)
{
  string str = "";
}

int i = 0; // scope error
string str = ""; // also scope error,
                 // because it's equivalent to declaring
                 // string str =""; before the for loop (see below)

最佳答案

我认为你们都混淆了 C++ 和 C#。

在 C++ 中,for 表达式中声明的变量的作用域通常在它后面的 block 之外。这在前一段时间被改变了,因此在 for 表达式中声明的变量的范围在它后面的 block 内部。 C# 沿用了后一种方法。但两者都与此无关。

这里发生的事情是 C# 不允许一个作用域在外部作用域中隐藏具有相同名称的变量。

所以,在 C++ 中,这曾经是非法的。现在是合法的。

for (int i; ; )
{
}
for (int i; ; )
{
}

同样的事情在 C# 中也是合法的。共有三个作用域,其中未定义“i”的外部作用域和两个子作用域,每个子作用域都声明了自己的“i”。

但是你正在做的是这样的:

int i;
for (int i; ; )
{
}

这里有两个作用域。声明“i”的外部和声明“i”的内部。这在 C++ 中是合法的 - 外部“i”是隐藏的 - 但在 C# 中是非法的,无论内部作用域是 for 循环、while 循环还是其他。

试试这个:

int i;
while (true)
{
    int i;
}

同样的问题。 C# 不允许在嵌套作用域中具有相同名称的变量。

关于c# - for 循环中计数器变量的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3426782/

相关文章:

c# - 找不到方法 'Void Newtonsoft.Json.Serialization.DefaultContractResolver.set_IgnoreSerializableAttribute(Boolean)

C# - 线程池与任务

C++ assert() 失败,没有给出任何错误消息,也没有给出失败的行

c 算法 - 问题

javascript - “节点”未定义。我们如何在应用程序级别定义?

c# - 手动更改 DateTime asp.net

c# - 有没有办法清除控制台的某个部分?

c++ - GDB 无法访问 mmap() 的内核分配内存?

java - 分配给事件处理程序方法中的全局变量的值未在另一个方法中重现

dart - 在像 Dart 这样的现代语言中,传递引用的真正含义是什么?