这里的问题在很大程度上是一种良好实践,可以防止意外错误。诚然,从 理论上讲
,C#编译器的设计可以使作用域之间没有冲突。但是,正如我所看到的,这将是很大的努力,但收效甚微。
考虑一下,如果
var在父作用域中的声明位于if语句 之前 ,则将存在无法解决的命名冲突。编译器根本不会区分以下两种情况。分析
完全是基于scope 而不是您似乎期望的声明/使用顺序。
理论上可以接受的(但就C#而言仍然无效):
if(true){ string var = "VAR";}string var = "New VAR!";和不可接受的(因为它将隐藏父变量):
string var = "New VAR!";if(true){ string var = "VAR";}在变量和范围方面,两者都完全相同。
现在,在此secenario中是否有任何实际原因,为什么您不能仅仅给变量之一起一个不同的名字?我假设(希望)没有调用您的实际变量
var,所以我并不认为这确实是一个问题。如果您仍想重用相同的变量名,只需将它们放在同级作用域中即可:
if(true){ string var = "VAR";}{ string var = "New VAR!";}但是,尽管这对于编译器是有效的,但在阅读代码时可能会引起一定程度的混乱,因此,我建议几乎在任何情况下都反对这样做。



