局部变量的作用域能污染更大的范围,奇怪了

局部变量的作用域会污染更大的范围,奇怪了!
本帖最后由 oqwerree 于 2014-09-29 12:53:35 编辑
例如,我有下面这样的一个小函数:

        public int f(int i, string s)
        {
            if (i == 1)
            {
                string ss = Convert.ToString(i);
                ss += "00";
                return int.Parse(ss);
            }
            string ss = Convert.ToString(i%2);
            return int.Parse(ss);
        }

会有编译错误error CS0136: A local variable named 'ss' cannot be declared in this scope because it would give a different meaning to 'ss', which is already used in a 'child' scope to denote something else

请问,if(i==1)内部的string ss声明是属于if代码块的,而且if之后马上return了。为什么if之外的ss,还被认为是重复声明呢?
我尝试了VS2008/VS2013,都报错。
这是为什么?
------解决思路----------------------
你知道return了,VS可不知道
------解决思路----------------------
非要这么用,你把下面的代码放else里
------解决思路----------------------
从人的逻辑上来看,ss在if里用完了就没用了
但是对于编译器来说,不管你是把外面的ss放到if前面还是if后面,都是重复定义,会引起歧义
毕竟还有goto这种用法可以把代码直接跳到if之前去,所以写在前面还是后面对于编译器来说是没有区别的
------解决思路----------------------
没用的,C#局部变量不能重复定义,即使定义了块:
int i = 1;
{
    inti= 2; // error
}
------解决思路----------------------
 public int f(int i, string s)
        {
            if (i == 1)
            {
                string ss = Convert.ToString(i);//方法内 局部变量
                ss += "00";
                return int.Parse(ss);
            }
            string ss = Convert.ToString(i%2);//方法内 全局变量,IDE 自上往下check,发现已经有 局部变量ss, 那这时候必然会冲突啊
            return int.Parse(ss);
        }

------解决思路----------------------
错误原因和这个类似
-

public void f(int i)
        {
            int a = 0;

            if (i == 1)
            {
                int a = 1;
            }
        }