делегат добавить и удалить - PullRequest
2 голосов
/ 04 января 2012

Я написал пример,

Когда я создал экземпляр делегата, как показано ниже

AddFunctions d1 += new AddFunctions(Function1); 

Я получил ошибку компиляции и, следовательно, + = был удален и создан таким образом

AddFunctions d1 = new AddFunctions(Function1);

Мне было просто любопытно узнать, почему нельзя создавать многоадресную передачу (+ =) при создании одного экземпляра делегата?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Delegates
{
    public delegate void AddFunctions();

    class Program
    {

        static void Main(string[] args)
        {
            AddFunctions d1 = new AddFunctions(Function1);
            d1 -= d1;
            d1();
        }

        static void Function1()
        {
        }

        static void Function2()
        {
        }
    }
}

Ответы [ 4 ]

5 голосов
/ 04 января 2012

Это по той же причине, по которой вам не разрешено иметь:

int i += 1;

Оператор += для делегатов является комбинацией.Это разрешено с событиями (где он отображается на метод доступа add) и полями / переменными (если переменная назначена) (где она отображается на Delegate.Combine)

Это действительно хотите использовать +=, попробуйте:

AddFunctions d1 = null;
d1 += Function1;

Однако легче выполнить следующее:

AddFunctions d1 = Function1;
3 голосов
/ 04 января 2012

Следующие работы, и инициализация = null не требуется.Это также объясняет, почему += не может использоваться в декаларации.

 AddFunctions d1 = null;
 d1 += new AddFunctions(Function1);

Это не имеет ничего общего с делегатами, но вы получаете ту же ошибку для

 int i += 1;
2 голосов
/ 04 января 2012

Оператор += объединяет существующий делегат с другим делегатом; d1 += d2 эквивалентно d1 = d1 + d2. Но в вашем случае d1 еще не инициализирован, поэтому нет смысла объединять его с другим делегатом. Вам нужно сначала инициализировать его с помощью =.

1 голос
/ 04 января 2012

Попробуйте:

AddFunctions d1 = null;
d1 += Function1;

, если вы хотите многоадресную рассылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...