为什么foreach循环中的局部变量与循环外声明的变量冲突?

鉴于此代码:

List things = new List(); foreach (string thing in things) { string foo = thing.ToUpper(); } string foo = String.Empty; 

为什么编译器会抱怨foo被声明了两次? 当然,在foreach循环中声明的实例仅在循环范围内有效吗?

虽然在声明它之后只能引用外部foo ,但是在函数的开头分配了本地,这意味着内部foo会使外部foo蒙上阴影,即使它尚未声明。