You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何向Click事件传入(null,null)时代码无法运行?

问题原因与解决方案

这个问题的核心是你误解了lambda表达式参数列表的写法——(null,null)并不是合法的参数声明方式,这才导致了编译错误。

为什么(foo,bar)能正常运行?

当你写(foo,bar)时,编译器会把foo和bar识别为两个参数的名称,并自动推断它们的类型匹配EventHandler委托要求的object(sender)和EventArgs(e)。这完全符合C#语法规则,所以编译器能正常处理,事件触发时也能正确接收框架传递的参数值(哪怕你没用到这两个参数)。

为什么(null,null)会报错?

null是C#的保留关键字,你不能把它用作参数的名称(就像你不能用int、class这类关键字当变量名一样)。当你写(null,null)时,编译器期望的是合法的标识符(参数名),而不是关键字null,这直接违反了语法规则,所以会抛出CS1026(缺少分号)、CS1002(语法错误)、CS1513(缺少右括号)这类编译错误。

你可能混淆了参数声明和参数取值:lambda的参数列表是用来声明你要接收的参数名称(和可选类型),而不是手动传递参数值——事件触发时,.NET框架会自动把sender和e的实际值传递给你的lambda表达式,你不需要手动指定它们为null。

正确的写法

根据你的需求,有两种规范的写法可选:

  1. 忽略参数(C# 7.0及以上版本推荐)
    用下划线_表示你不需要使用这两个参数,这是C#官方推荐的忽略未使用参数的语法:

    using System.Windows.Forms;
    namespace Hello_World
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.messageButton.Click += (_, _) => MessageBox.Show("Hello");
            }
        }
    }
    
  2. 声明参数但不使用
    如果你用的是更早的C#版本,或者更习惯显式声明参数名,直接写两个合法的参数名即可(哪怕你完全不用它们):

    using System.Windows.Forms;
    namespace Hello_World
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.messageButton.Click += (sender, e) => MessageBox.Show("Hello");
            }
        }
    }
    

内容的提问来源于stack exchange,提问作者Lyrk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:29:37