Подтвердить что ты не робот

Действие <объект, EventArgs> не может быть передано в EventHandler?

Я подключил событие, чтобы использовать лямбду, которая должна была удалиться после запуска. Я не мог этого сделать, вставив лямбда в событие + = (без переменной доступа, используемой для удаления события), поэтому я установил переменную Action<object, EventArgs> и переместил там лямбда. Основная ошибка заключалась в том, что он не смог преобразовать Action<object, EventArgs> в EventHandler. Я думал, что лямбда-выражения неявно конвертируются в обработчики событий, почему это не работает?

4b9b3361

Ответ 1

Lambdas неявно конвертируемы для делегирования типов с правильной формой, но два типа делегатов одинаковой формы неявно конвертируются друг в друга. Просто сделайте, чтобы локальная переменная имела тип EventHandler.

EventHandler h = (o, ea) => { ... };
e += h;
...
e -= h;

(в случае, если это помогает:

Action<object, EventArgs> a = (o, ea) => { }; 
EventHandler e = a;  // not allowed
EventHandler e2 = (o,ea) => a(o,ea);  // ok

)

Ответ 2

Action<Object, EventArgs> a = (o, ea) => { };
EventHandler e = a.Invoke;

Ответ 3

В общем, делегаты не могут быть отброшены, потому что у них нет дерева наследования, определяющего, какие действия действительны. Для этого у вас есть два варианта:

  • Используйте переменную типа EventHandler вместо Action<T1, T2>
  • Используйте встроенную декларацию.

    // option 1: local variable
    EventHandler eh = (o, ea) => { /* [snip] */ };
    obj.event += eh;
    obj.event -= eh;
    
    // option 2: inline declaration
    obj.event += (o, ea) => { /* [snip] */ };
    

Ответ 4

Вместо этого вы можете использовать анонимный метод:

Event += (sender, e) =>
{
     // Multiple lines
     // of code here
};

Ответ 5

Объявите свое событие как

public event Action<object, EventArgs> e;

Затем вы можете напрямую добавить свое действие:

Action<object, EventArgs> a = something;
e += a;