if(true)
{
string var = "VAR";
}
string var = "New VAR!";
这将导致:
Error 1 A local variable named 'var' cannot be declared in this scope because it would give a different meaning to 'var', which is already used in a 'child' scope to denote something else.
确实没有什么惊天动地的,但这不是完全错误的吗?我和一位开发人员想知道第一个声明是否应该在不同的范围内,因此第二个声明不能干扰第一个声明。
为什么 C# 无法区分这两个作用域?第一个 IF 范围不应该与方法的其余部分完全分开吗?
我不能从 if 外部调用 var,所以错误消息是错误的,因为第一个 var 在第二个范围内没有相关性。
最佳答案
这里的问题主要是良好实践和防止无意中的错误。诚然,C# 编译器理论上可以设计成在此处的作用域之间没有冲突。然而,正如我所见,这会付出很多努力却收效甚微。
考虑一下,如果父作用域中 var 的声明在 if 语句之前,将会出现无法解决的命名冲突。编译器根本不区分以下两种情况。分析完全基于范围,而不是您似乎期望的声明/使用顺序。
理论上可以接受(但对C#而言仍然无效):
if(true)
{
string var = "VAR";
}
string var = "New VAR!";
和 Not Acceptable (因为它会隐藏父变量):
string var = "New VAR!";
if(true)
{
string var = "VAR";
}
两者在变量和作用域方面完全相同。
现在,在这个场景中是否有任何实际原因导致您不能只给其中一个变量一个不同的名称?我假设(希望)您的实际变量没有被称为 var,所以我真的不认为这是一个问题。如果您仍然打算重用相同的变量名,只需将它们放在同级作用域中即可:
if(true)
{
string var = "VAR";
}
{
string var = "New VAR!";
}
然而,虽然这对编译器有效,但在阅读代码时可能会导致一些困惑,因此我几乎在任何情况下都建议不要这样做。
关于C# 变量作用域 : 'x' cannot be declared in this scope because it would give a different meaning to 'x' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2049330/