首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能分配一个委托变量来注册一个事件处理程序?

为什么我不能分配一个委托变量来注册一个事件处理程序?
EN

Stack Overflow用户
提问于 2012-03-17 08:28:34
回答 1查看 261关注 0票数 0

以下两种方法都可以正常工作:

代码语言:javascript
复制
    BindingList<Employee> lstEmployees = new BindingList<Employee>();

    //delegate pointing to an anonymous method
    //----------------------------------------
    delegate void ListChanged(object lst, ListChangedEventArgs args);
    private void Form1_Load(object sender, EventArgs e)
    {
        listBox1.ValueMember = "Empno";
        listBox1.DisplayMember = "Ename";
        listBox1.DataSource = lstEmployees;

        ListChanged lstchanged = delegate(object lst, ListChangedEventArgs args)
        {
            lblEmpCount.Text = lstEmployees.Count.ToString();
        };

        lstEmployees.ListChanged += new ListChangedEventHandler(lstchanged);
    }

    //Anonymous method (with params)
    //-----------------------------------------------------
    private void Form1_Load(object sender, EventArgs e)
    {
        listBox1.ValueMember = "Empno";
        listBox1.DisplayMember = "Ename";
        listBox1.DataSource = lstEmployees;

        lstEmployees.ListChanged += delegate(object lst, ListChangedEventArgs args)
        {
            lblEmpCount.Text = lstEmployees.Count.ToString();
        };
    }

但不包括以下内容:

代码语言:javascript
复制
    delegate void ListChanged(object lst, ListChangedEventArgs args);
    private void Form1_Load(object sender, EventArgs e)
    {
        listBox1.ValueMember = "Empno";
        listBox1.DisplayMember = "Ename";
        listBox1.DataSource = lstEmployees;

        ListChanged lstchanged = delegate(object lst, ListChangedEventArgs args)
        {
            lblEmpCount.Text = lstEmployees.Count.ToString();
        };

        lstEmployees.ListChanged += lstchanged; //error here
    }

如果我可以直接分配一个匿名方法(这是一个委托),为什么不能指定一个委托变量呢?我只是试图理解这三种方法之间的区别,以及为什么我不能编写第三种方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-17 12:15:52

您不需要定义此委托:

代码语言:javascript
复制
delegate void ListChanged(object lst, ListChangedEventArgs args);

您可以简单地使用System.ComponentModel命名空间中已经定义的委托(ListChangedEventHandler):

代码语言:javascript
复制
ListChangedEventHandler lstchanged = delegate(object lst, ListChangedEventArgs args)
{
    lblEmpCount.Text = lstEmployees.Count.ToString();
};

lstEmployees.ListChanged += lstchanged; // no error

ListChanged事件的类型为ListChangedEventHandler。因此,您不能期望它接受其他类型的事件处理程序。下面这一行是错误的,因为在您的代码中,lstchanged是您自己的委托类型(ListChanged),而它必须是ListChangedEventHandler类型。

代码语言:javascript
复制
lstEmployees.ListChanged += lstchanged; //error here

有关更多信息,请阅读this article

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9746150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档