根据我的 scope 理解,第一个例子应该没问题。
你的 scope 理解正确。这不是作用域错误,而是简单名称错误的不一致使用。
int i = 10; // 错误:“i”已经存在
那不是报告的错误。报告的错误是“无法在此范围内声明名为 i 的局部变量,因为这会赋予 i 不同的含义,在子范围中已经用于表示其他内容”。
错误消息告诉您错误在哪里,再次阅读错误消息。它没有说明声明之间有冲突,而是说错误是因为改变了简单名称的含义。出错的原因不是重复声明;即使这些作用域嵌套,并且在两个不同的作用域中有两个具有相同名称的元素是合法的。不合法的是在嵌套的本地变量声明空间中使一个简单名称意味着两个不同的东西。
如果您像下面这样做,就会收到“在此范围内已经定义了名为 i 的局部变量”的错误:
int i = 10;
int i = 10;
当然,“i”要么在作用域内,要么不在。
是的,但这有什么关系呢?一个给定的“i”是否在作用域内是无关紧要的。例如:
class C
{
int i;
void M()
{
string i;
完全合法。在整个 M 函数中,外部 i 变量都是可见的。在局部声明一个同名的变量并不会有问题。如果你这样做:
class C
{
int i;
void M()
{
int x = i;
foreach(char i in ...
因为现在你在两个嵌套的局部变量声明空间中使用了i来代表两个不同的东西--一个循环变量和一个字段。这样会让人混淆并容易出错,因此我们将其禁止。
我是否对作用域有一些不明显的理解,导致编译器无法真正地解决这个问题?
我不理解这个问题。显然编译器能够完全分析程序;如果编译器不能解决每个i的含义,那么它怎么能报告错误消息呢? 编译器完全能够确定你在同一个局部变量声明空间中使用了“i”表示两个不同的东西,并相应地报告错误。
i
呢?我仍然认为这只是编译器方面的官僚主义。 - Michael Meadows