变量'<variablename>'隐藏封闭块中的变量

Wil*_*Wil 3 .net vb.net syntax-error

当从MSDN复制并粘贴一些示例代码时,我想出了标题中的错误 - 变量''隐藏了一个封闭块中的变量,

我复制的只是try循环的一个非常基本的例子.

正如它在建议中所说的那样"这个错误的一个常见原因是在事件处理程序中使用Catch e As Exception.如果是这种情况,请将Catch块变量命名为ex而不是e."

所以,我这样做,既改变了eex和它的工作,但是,我不明白为什么这不会导致同样的错误.

有人可以更好地解释错误是什么以及为什么导致它,而前者不是?

编辑 -

代码示例...

    Try
    Catch e As Exception
        msgbox(e.Message)
    End Try
Run Code Online (Sandbox Code Playgroud)

.

    Try
    Catch ex As Exception
        msgbox(ex.Message)
    End Try
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么第一个导致问题,而第二个不导致问题,对我而言,就像......使用上面的苹果,下面的苹果 - 说你不能在两个地方使用相同的东西然后将两者都改为橙子并突然让它发挥作用.当然第二个与第一个相同.

Chr*_*ris 13

您可能希望粘贴错误的完整代码以进行确认,但我认为事件处理程序定义了一个名为"e"的参数.然后,当您放入catch块时,它也会尝试定义"e",从而导致错误.当然,当catch定义"ex"而不是"e"时,没有名称冲突发生,所以它的工作原理.

编辑:编辑添加更清晰的例子,我假设是breoken代码.

我假设您的破解代码如下:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    Try
    Catch e As Exception
        msgbox(e.Message)
    End Try
End Sub
Run Code Online (Sandbox Code Playgroud)

你可以看到e的两个声明,一个在ByVal e As System.EventArgs另一个中Catch e As Exception.


Kar*_*nek 9

该错误消息意味着您声明一个名称已存在的变量:

int abc = 0;
if (abc == 0)  {
  int abc = 1;  // Error
}
Run Code Online (Sandbox Code Playgroud)

这个规则当然适用于尝试..捕获.