C#变量作用域:无法在此范围内声明“ x”,因为它将赋予“ x”不同的含义
if(true){
string var = "VAR";
}
string var = "New VAR!";
这将导致:
错误1无法在此范围中声明名为“ var”的局部变量,因为它将赋予“ var”不同的含义,“ var”已在“子”范围中用于表示其他内容。
真的什么都没有,但是这不是唯一的错误吗?我和一位开发人员同行,我想知道第一个声明是否应该在不同的范围内,因此第二个声明不能干扰第一个声明。
为什么C#无法区分这两个范围?是否应该将第一个IF范围与该方法的其余部分完全分开?
我无法从if外部调用var,因此错误消息是错误的,因为第一个var与第二个作用域无关。
回答:
这里的问题在很大程度上是一种良好实践,可以防止意外错误。诚然,从 理论上讲
,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!";
}
但是,尽管这对于编译器是有效的,但在阅读代码时可能会引起一定程度的混乱,因此,我建议几乎在任何情况下都反对这样做。
以上是 C#变量作用域:无法在此范围内声明“ x”,因为它将赋予“ x”不同的含义 的全部内容, 来源链接: utcz.com/qa/428178.html