【问题标题】:C# Lambda expression -HelpC# Lambda 表达式 - 帮助
【发布时间】:2009-11-15 17:37:21
【问题描述】:

我正在学习 lambda 表达式和委托。当我尝试执行以下操作时,我在标记为粗体的行处遇到错误。 (错误:运算符“+=”不能应用于“Test.MessageDelegate”和“lambda 表达式”类型的操作数)。帮我处理 lambda 表达式。

namespace Test
{
    public delegate void MessageDelegate(string title,object sender,EventArgs e);
    class Program
    {
        static event MessageDelegate logEvent;

        static void Main(string[] args)
        {
            logEvent = new MessageDelegate(OnLog);
            logEvent("title",Program.logEvent,EventArgs.Empty);
logEvent += (src, e) => { OnLog("Some",src, e); };
            Console.ReadKey(true);

        }

        static void OnLog(string title, object sender, EventArgs e)
        {
            if (logEvent != null)
            {
                Console.WriteLine("title={0}", title);
                Console.WriteLine("sender={0}", sender);
                Console.WriteLine("arguments={0}",e.GetType());
            }
        }
     }

 }

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

    由于 logEvent 将 MessageDelegate 作为其事件处理程序,因此您需要 lambda 表达式 (src, e) 的左手来匹配 MessageDelegate 的签名

    更改为(str, src, e) => OnLog(str, src, e)

    【讨论】:

    • 假设如果我将 Main() 更新为 logEvent += (str, src, e) => { OnLog("One",Program.logEvent, EventArgs.Empty); }; logEvent += (str, src, e) => { OnLog("Two",Program.logEvent, EventArgs.Empty); }; (什么都没有执行,我怎么能调用它?)
    • 我的意思是,考虑到 Main() 只有两行,如上述评论中所述。
    • 嗯,我不确定我是否遵循您想要在这里做的事情。 "+=" 为某个事件分配一个侦听器。当 logEvent 发生时,调用 OnLog。那行代码本身不会引发日志事件,它只说明在引发事件时要做什么。要引发日志事件,您应该执行 'if(logEvent != null) logEvent("title", this, null);' (或任何你想通过的)
    • 因为我已经分配了一个监听器,所以我调用它就像 if(logEvent!=null) logEvent(null,null,null); .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多