Почему я не могу назначить переменную-делегат для регистрации обработчика событий? - PullRequest
0 голосов
/ 17 марта 2012

Хорошо работают оба следующих условия:

    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();
        };
    }

Но не следующее:

    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
    }

Если я могу назначить анонимный метод напрямую (который является делегатом), почему бы и нетпеременная делегата?Я просто пытаюсь понять разницу между всеми тремя методами и почему я не могу написать третий.

1 Ответ

0 голосов
/ 17 марта 2012

Вам не нужно определять этот делегат:

delegate void ListChanged(object lst, ListChangedEventArgs args);

Вы можете просто использовать уже определенный делегат (ListChangedEventHandler) из System.ComponentModel namesapce:

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

lstEmployees.ListChanged += lstchanged; // no error

ListChanged Событие имеет тип ListChangedEventHandler. Поэтому вы не можете ожидать, что он примет обработчик событий другого типа. Следующая строка неверна, потому что в вашем коде lstchanged имеет ваш собственный тип делегата (ListChanged), в то время как он должен иметь тип ListChangedEventHandler.

lstEmployees.ListChanged += lstchanged; //error here

Для получения дополнительной информации вы можете прочитать эту статью .

...