Действие <object, EventArgs> не может быть приведено к EventHandler? - PullRequest
26 голосов
/ 12 октября 2009

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

Ответы [ 5 ]

40 голосов
/ 12 октября 2009
Action<Object, EventArgs> a = (o, ea) => { };
EventHandler e = a.Invoke;
36 голосов
/ 12 октября 2009

Лямбды неявно преобразуются в типы делегатов с правильной формой, но два типа делегатов одинаковой формы неявно преобразуются друг в друга. Просто сделайте вместо локальной переменной тип 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 голосов
/ 12 октября 2009

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

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

    // option 1: local variable
    EventHandler eh = (o, ea) => { /* [snip] */ };
    obj.event += eh;
    obj.event -= eh;
    
    // option 2: inline declaration
    obj.event += (o, ea) => { /* [snip] */ };
    
1 голос
/ 19 января 2018

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

public event Action<object, EventArgs> e;

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

Action<object, EventArgs> a = something;
e += a;
0 голосов
/ 12 октября 2009

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

Event += (sender, e) =>
{
     // Multiple lines
     // of code here
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...