Я пытаюсь скопировать некоторый код C #, который создает IObservable
из события Button.Click
.Я хочу перенести этот код на F #.
Вот оригинальный код C #, который компилируется без ошибок:
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
.
С другой стороны, кажется, что компилятор C #нет проблем с принятием h => new RoutedEventHandler(h)
Интересно, что в обоих примерах кода (C # и F #) тип h
равен EventHandler<RoutedEventArgs>
.
Сообщение об ошибке, которое я получаю отКомпилятор F #:
Ошибка 2 Ожидается, что это выражение имеет тип obj -> RoutedEventArgs -> unit, но здесь имеет тип EventHandler
Подпись для RoutedEventHandler
Внутри PresentationCore я обнаружил:
public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);
Как вы можете видеть, он принимает object
и RoutedEventArgs
в качестве параметров, поэтому компилятор F # действительно корректен.
Есть ли какая-то магия, которую компилятор C # делает за кулисами, чтобы сделать эту работу, чего не делает компилятор F #, или я просто что-то здесь упускаю?
В любом случае, как мне сделатьэта работа в F #?