【问题标题】:Handling delegate with out parameter处理没有参数的委托
【发布时间】:2012-07-16 08:52:20
【问题描述】:

我有一个带输出参数的委托和事件:

public delegate void ExampleDelegate(object sender, EventArgs e, out string value);

公共事件 ExampleDelegate 示例;

当我试图处理事件时:

 mg.Example += (sender, e, val) =>
 {
    //do stuff
 };

我收到错误参数 3 必须用 'out' 关键字声明

当我像这样输入建议的 out 关键字时:

 mg.Example += (sender, e, out val) =>
 {
    //do stuff
 };

我遇到了额外的错误找不到命名空间名称“val”的类型..etc

我做错了什么?

【问题讨论】:

  • 你破坏了事件处理程序的设计。改为创建您自己的 EventArgs 类。
  • @AmiramKorach 你的答案就是我要找的那个

标签: c# anonymous-methods


【解决方案1】:

嗯,正如上面写的here,你需要指定val的类型:

(sender, e, out string val)=> ...

【讨论】:

  • 关于您链接到的答案的注释说您需要为 all 参数指定类型。
【解决方案2】:

您的事件处理程序不符合 .net 准则。

如果您必须这样使用它,请使用委托,而不是事件。

如果你有两个事件处理程序修改你的 out 参数,你会遇到麻烦。

参考:Events Tutorial

.NET 框架指南

虽然 C# 语言允许事件使用任何委托类型,但 .NET Framework 对委托类型有一些更严格的准则 应该用于事件。如果您打算使用您的组件 使用 .NET Framework,您可能需要遵循这些 指导方针。

.NET Framework 指南指出委托类型用于 一个事件应该有两个参数,一个“对象源”参数 指示事件的来源,以及一个“e”参数 封装有关事件的任何附加信息。的类型 “e”参数应派生自 EventArgs 类。对于活动 不使用任何附加信息的 .NET Framework 具有 已经定义了一个合适的委托类型:EventHandler。

zmbq 已经给出了如何纠正错误的答案。

我添加这个只是为了完整性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多