局部变量的作用域能污染更大的范围,奇怪了
局部变量的作用域会污染更大的范围,奇怪了!
例如,我有下面这样的一个小函数:
会有编译错误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);
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;
}
}