C/C++ 和 C# 之间的变量范围差异或调试器中的怪癖?

Difference in variable scope between C/C++ and C# or a quirk in the debugger?

我已经通过替换第二个变量的名称解决了这个问题,因此这是一个低优先级的问题,但我想了解发生了什么。

我的 C# 代码中有这种情况(变量 'list' 的值为“V3”):

foreach (string entry in list.Split()){                   // Loop1
    ...
}

string [] list_statuses = { "V1", "V2", "V3", "V4", ...};
foreach (string entry in list_statuses) {                 // Loop2
    ...
}

我期待以下行为:

  1. 在循环1中,变量'entry'只得到值“V3”,循环运行一次就结束了。
  2. 在循环 2 中,变量 'entry' 取值“V1”、“V2”、“V3”,...,循环 运行 所有这些时间并结束。

重要提示:循环1中的变量'entry'与循环2中的变量'entry'不同:
Loop1中'entry'的作用域仅限于Loop1,Loop2中使用了一个全新的同名变量

令我惊讶的是,在调试它时,在 Loop2 中,该变量在不同时间获得值“V3”,就好像 C# 没有按预期考虑该变量的范围。
在更改第二个变量的名称时,问题解决了,但我想了解这里发生了什么:
我对变量范围的理解来自 C/C++ 语言。观察到的行为是错误还是 C# 和 C/C++ 之间的变量范围存在差异?

哦,如果这是调试器中的问题:我正在使用 Visual Studio Enterprise 2017,版本 15.9.44。

这是调试器中的一个怪癖:
当我在调试器中检查值时,该值似乎是错误的。
当我在屏幕上打印时,该值似乎是正确的。

出于显而易见的原因,我总是混淆我的代码以隐藏我的源代码并创建一个 so-called 最小且可重现的示例。但在这种情况下似乎是不可能的:当我在我的程序中插入这个问题的代码时,一切似乎都正常。

我相信这个问题可以关闭,说明如果 Visual Studio 中的 C# 调试器似乎无法在变量范围内正常工作,这可能是由于一些奇怪的调试器错误。在这种情况下,我建议:

  • 检查真实行为(使用日志)
  • 要么使用不同的变量名,以避免问题。