Я пытаюсь реплицировать некоторый код С#, который создает IObservable
из события Button.Click
.
Я хочу передать этот код в F #.
Вот исходный код С#, который компилируется без ошибок:
Observable.FromEvent<RoutedEventHandler, RoutedEventArgs>(
h => new RoutedEventHandler(h),
h => btn.Click += h,
h => btn.Click -= h))
Вот моя неудачная попытка сделать то же самое в F #:
Observable.FromEvent<RoutedEventHandler, RoutedEventArgs>(
Func<EventHandler<RoutedEventArgs>, RoutedEventHandler>(fun h -> RoutedEventHandler(h)),
Action<RoutedEventHandler>(fun h -> btn.Click.AddHandler h),
Action<RoutedEventHandler>(fun h -> btn.Click.RemoveHandler h))
Все радует, за исключением второй строки заявления.
Компилятор F # жалуется на fun h -> RoutedEventHandler(h)
, потому что
он не хочет исключать h
в качестве параметра конструктору RoutedEventHandler
.
С другой стороны, у компилятора С# нет проблем с принятием h => new RoutedEventHandler(h)
Интересно, что в обоих образцах кода (С# и F #) тип h
равен EventHandler<RoutedEventArgs>
.
Сообщение об ошибке, которое я получаю от компилятора F #:
Ошибка 2 Это выражение должно было иметь тип obj → RoutedEventArgs → unit, но здесь есть тип EventHandler
Подписи для RoutedEventHandler
, которые я нашел внутри PresentationCore, это:
public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);
Как вы можете видеть, он принимает параметры object
и RoutedEventArgs
, поэтому компилятор F # на самом деле правильный.
Есть ли какая-то магия, которую компилятор С# делает за кулисами, чтобы сделать эту работу компилятором F # или я просто что-то пропустил здесь?
В любом случае, как я могу сделать эту работу в F #?