一尘不染

C#变量作用域:无法在此范围内声明“ x”,因为它将赋予“ x”不同的含义

c#

if(true)
{
    string var = "VAR";
}

string var = "New VAR!";

这将导致:

错误1无法在此范围中声明名为“ var”的局部变量,因为它将赋予“ var”不同的含义,“ var”已在“子”范围中用于表示其他内容。

真的什么都没有,但是这不是唯一的错误吗?我和一位开发人员同行,我想知道第一个声明是否应该在不同的范围内,因此第二个声明不能干扰第一个声明。

为什么C#无法区分这两个范围?是否应该将第一个IF范围与该方法的其余部分完全分开?

我无法从if外部调用var,因此错误消息是错误的,因为第一个var与第二个作用域无关。


阅读 799

收藏
2020-05-19

共1个答案

一尘不染

这里的问题在很大程度上是一种良好实践,可以防止意外错误。诚然,从 理论上讲
,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!";
}

但是,尽管这对于编译器是有效的,但在阅读代码时可能会引起一定程度的混乱,因此,我建议几乎在任何情况下都反对这样做。

2020-05-19