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