C# - 如何在“封闭”的本地作用域中使用变量?

4
我正在尝试为一个C#应用程序添加一些新功能,特别是尝试复制它的某些行为,但是在Web浏览器中而不是在当前应用程序中。
我正在尝试从MainWindow.cs类中的一个方法调用已在Browser.cs类中定义的方法。
该方法在Browser.cs中定义为:
public partial class Browser : Form{
    public Browser(){
        ...
    }
    public void Browser_Load(object sender, EventArgs e){
        webKitBrowser1.Navigate("https://google.com");
    }
    ...
}

我现在试图从MainWindow.cs中调用它,代码如下:
public partial class MainWindow : Window{
    ...
    public MainWindow(){
        ...
        Browser mBrowser = new Browser();
        Object sender = new Object();
        EventArgs e = new EventArgs();
        mBrowser.Browser_Load(sender, e);
        ...
    }
    ...
}

但是,我得到了一个编译错误,错误提示如下:

无法在此范围内声明名为'e'的局部变量或参数,因为该名称在封闭的局部范围内用于定义局部变量或参数

这是什么意思?我以前从未遇到过这种错误-我在与声明变量相同的作用域内使用该变量-它所说的“封闭本地作用域”是什么意思?是因为我在方法调用 mBrowser.Browser_Load(sender, e) 的括号内使用了 e 吗?

毫无疑问,由于对此方法的调用与我定义 e 的作用域相同,因此它不应该是作用域的问题吧?

我尝试使用以下方法进行调用:

mBrowser.Browser_Load(sender, EventArgs e);

但这给我带来了一个编译错误,显示为:

'EventArgs'是一种类型,在给定的上下文中无效。

有人能指出我在这里做错了什么吗?我应该怎么做才能正确调用这个方法呢?


2
在该方法中是否有类似于catch(Exception e)的语句? - Sean
1
你在同一作用域中使用了两个名为e的变量。通常是由于事件被称为e以及异常而发生的。将你的异常更改为ex,或将你的事件从e重命名为event,你就可以解决问题了。如果你只需要一个具有默认属性的默认EventArgs对象,也可以使用EventArgs.Empty - ManoDestra
太棒了-我错把“Exception”命名为“e”了-非常感谢! - Noble-Surfer
mBrowser.Browser_Load(sender, EventArgs e); 不是有效的,你需要使用 mBrowser.Browser_Load(sender, e);,只是说一下。 - Mafii
2个回答

10

错误非常明显,您已经在当前作用域中定义了名为 e 的变量,(可能是在您未展示的代码部分中)

但更重要的是,您不应该像那样调用 Load 事件,相反将功能提取到单独的方法中并从您的 Load 事件和其他位置调用该方法

例如:

public void SomeMethodToBeCalledOnLoad()
{
    webKitBrowser1.Navigate("https://google.com");
}

public void Browser_Load(object sender, EventArgs e)
{
    SomeMethodToBeCalledOnLoad();
}

public MainWindow(){
    ...
    Browser mBrowser = new Browser();
    Object sender = new Object();
    EventArgs e = new EventArgs();
    SomeMethodToBeCalledOnLoad();//here
    ...
}

1
谢谢,是的,我错过了已经有一个叫做“e”的异常 - 我刚刚开始看这段代码。 - Noble-Surfer
1
不要将你的异常命名为 e,大多数人都会将它们命名为 ex。不建议使用 e,因为它被事件使用(正如你刚刚意识到的那样)。 - Mafii
1
@someone2088,你在 Browser_Load 中的功能是在一个事件中,虽然它也是一个方法,但是,通常情况下显式调用事件被认为是不好的实践。事件应该是发生的。如果你想显式调用 Browsers_Load 事件中的代码,那么最好将该代码提取到一个单独的方法中,然后从 Load 事件和其他地方调用该方法。 - Habib
啊,好的,感谢您的解释。我之所以把这个功能放在那里,是因为当我目前运行应用程序时,浏览器不会加载(或者至少不可见),我只能看到已经存在的底层应用程序 - 我正在尝试使用System.Windows.Forms提供的功能将该应用程序显示在Web浏览器中...您有任何想法吗? - Noble-Surfer
那里定义的 Browser 类是这样定义的:public partial class Browser : Form{ ... }。它是否应该改为 : WebBrowser{ ... } 而不是 : Form{ ... } - Noble-Surfer
显示剩余3条评论

0

您的范围内已经存在一个名为 e 的变量。

请尝试像这样调用您的方法

mBrowser.Browser_Load(this, EventArgs.Empty);

错误应该就会消失了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接