Я подключил событие, чтобы использовать лямбду, которая должна была удалиться после запуска. Я не мог этого сделать, вставив лямбда в событие + = (без переменной доступа, используемой для удаления события), поэтому я установил переменную Action<object, EventArgs>
и переместил там лямбда. Основная ошибка заключалась в том, что он не смог преобразовать Action<object, EventArgs>
в EventHandler. Я думал, что лямбда-выражения неявно конвертируются в обработчики событий, почему это не работает?Действие <объект, EventArgs> не может быть передано в EventHandler?
ответ
Лямбда неявно конвертируемая делегировать типы с правильной формой, но два одинаковых-формой типа делегата не неявно преобразован друг к другу. Просто сделайте, чтобы локальная переменная имела тип 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
)
Вы можете использовать анонимный метод вместо:
Event += (sender, e) =>
{
// Multiple lines
// of code here
};
Вот весь смысл .... У меня есть один набор только сохраняется в переменной, чтобы я мог удалить событие при запуске, только он не будет работать. – RCIX
объявить переменную как EventHandler, и вы должны быть в порядке ... –
В целом, делегаты не могут быть отлиты, потому что они не имеют никакого наследования дерева определения того, какие броски действительны. С этой целью, у вас есть два варианта:
- использовать переменную типа
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] */ };
Весь смысл использования переменной состоял в том, что я мог удалить событие из обработчика события, все еще внутри события. Тем не менее, +1. – RCIX
Action<Object, EventArgs> a = (o, ea) => { };
EventHandler e = a.Invoke;
Это действительно умно. –
Объявите ваше событие как
public event Action<object, EventArgs> e;
Тогда вы можете напрямую добавить свое действие:
Action<object, EventArgs> a = something;
e += a;
- 1. Что может быть передано в (void *) контексте?
- 2. org.Opencv.core.Mat не может быть Передано в java.util.list в студии android
- 3. Сколько аргументов может быть передано filter()
- 4. Действие не может быть превращено в функцию
- 5. Значение, возвращаемое ngResource, не может быть передано контроллеру?
- 6. Ошибка значения Python: не может быть передано вместе с фигурами
- 7. Значение не может быть передано другому публичному статическому методу (java)
- 8. EventHandler <T> and EventHandler
- 9. Объект GetSection не может быть отнесен к IDictionary <>
- 10. тип или пространство имен имя 'EventHandler' не может быть найдено
- 11. Объект не может быть решен
- 12. Действие не может быть найдено для контроллера
- 13. приложение не должно быть передано другим пользователям
- 14. Целевой объект не может быть
- 15. Объект не может быть преобразован
- 16. Сколько бит может быть передано через Ethernet в каждый момент?
- 17. Сколько параметров может быть передано в пользовательской функции?
- 18. Каким образом dhclient может быть передано в пространство имен?
- 19. Объект [] не может быть преобразован в String []
- 20. Объект не может быть преобразован в строку
- 21. Объект не может быть отлит в ArrayList
- 22. Объект не может быть преобразован в строку
- 23. Мишени-объект не может быть найден в
- 24. Объект не может быть преобразован в строку?
- 25. Ошибка сокета Java: сообщение может быть передано только один раз
- 26. Может ли выражение лямбда быть передано как указатель функции?
- 27. Ошибка. оператор <не может быть применен
- 28. LMAX Disruptor: Должен объект клонирования EventHandler, полученный от EventHandler # onEvent
- 29. Что должно быть передано в: (NSString *) текст
- 30. Объект типа 'Объект' не может быть преобразован в тип 'Array'
За исключением того, что e2 теперь проходит через два вызова функций, чтобы на самом деле что-либо сделать ... eww. –
Я не продвигаю e2 как хороший способ писать код, я просто использую его в качестве примера, чтобы продемонстрировать, что есть и не является законным в отношении системы типа C#. – Brian
@Matthew Scharley - вы измерили накладные расходы? –