【问题标题】:C#- using a variable in an 'enclosing' local scope?C#- 在“封闭”局部范围内使用变量?
【发布时间】:2016-04-27 14:35:58
【问题描述】:

我正在尝试向 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”的本地或参数,因为该名称在封闭的本地范围中用于定义本地或参数

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

当然,既然对这个方法的调用与我定义的e在同一个范围内,这不应该是范围的问题吗?

我确实尝试通过以下方式进行通话:

mBrowser.Browser_Load(sender, EventArgs e);

但这给了我一个编译错误:

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

谁能指出我在这里做错了什么,以及我应该做些什么才能正确调用这个方法?

【问题讨论】:

  • 你的方法中有catch(Exception e)之类的东西吗?
  • 您在同一范围内使用了两个名为 e 的变量。通常由于调用 e 的事件以及异常而发生。将您的例外更改为 ex,或将您的事件从 e 重命名为 event,您会没事的。如果您只需要具有默认属性的默认 EventArgs 对象,您也可以使用EventArgs.Empty。
  • 太棒了-错过了我也将Exception称为“e”-非常感谢!
  • mBrowser.Browser_Load(sender, EventArgs e); 无效,您必须使用mBrowser.Browser_Load(sender, e);,只是说

标签: c# wpf scope variable-declaration


【解决方案1】:

错误很明显,您已经在作用域中定义了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
    ...
}

【讨论】:

  • 谢谢-是的,错过了一个名为e的异常已经存在-我才刚刚开始查看此代码。
  • 不要将您的异常命名为e,大多数人将它们命名为ex。不建议使用 e,因为它被事件使用(正如您刚刚意识到的那样)。
  • “以单独的方法提取功能”是什么意思?您是指Browser_Load() 方法提供的功能吗?该方法是在Browser.cs 中定义的,所以它已经在一个单独的方法中不是吗?
  • @someone2088,您在Browser_Load 中的功能在一个事件中,虽然它也是一种方法,但是,通常认为显式调用事件是不好的做法。假设事件发生。如果你想显式调用Browsers_Load事件中的代码,那么最好将该代码提取到一个单独的方法中,然后从Load事件和其他地方调用该方法。
  • 好的,谢谢你的解释。我把功能放在那里的原因是,当我现在运行应用程序时,浏览器没有加载(或者至少不可见),我看到的只是底层应用程序,它已经存在了——我正在尝试使用System.Windows.Forms 提供的功能让该应用程序显示在网络浏览器中...知道我会怎么做吗?
【解决方案2】:

您已经在作用域中有一个名为 e 的变量。

尝试像这样调用你的方法

mBrowser.Browser_Load(this, EventArgs.Empty);

错误应该消失。

【讨论】:

    猜你喜欢
    • 2016-11-13
    • 2015-10-08
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多