У меня есть интерфейс, написанный на C #, который определяется следующим образом:
public interface IWidget
{
object Evaluate();
event EventHandler Invalidated;
}
Когда я пытаюсь реализовать этот интерфейс в F #, я смотрю на то, что F # думает, что интерфейс IWidget (при наведении мышинад ним), и я вижу
type IWidget =
interface
member Evaluate : unit -> obj
end
Кажется, что оно полностью игнорирует событие Invalidated ... это известная проблема с F #, и если да, то есть ли способ обойти это?При реализации моей версии FW IWidget, я могу просто реализовать это событие вне раздела IWidget или как?Кажется очень неприятным, что f # так плохо обрабатывает ключевое слово "event" ...
ОБНОВЛЕНИЕ: После дальнейших разборок студия потом говорила что-то вроде:
'Реализация для IWidget не была предоставлена.remove_Invalidate (значение: EventHandler): unit '
затем, когда я добавил эти методы, чтобы все выглядело так:
interface IWidget with
member w.Evaluate() = new obj()
member w.add_Invalidated(value:EventHandler) = ()
member w.remove_Invalidated(value:EventHandler) = ()
end
он скомпилировался нормально, хотя подсказка все еще говорилаединственным членом IWidget был Evaluate () ... похоже, что способ F # (или, по крайней мере, IDE) обрабатывает этот материал, действительно чокнутый ...
ДРУГОЕ ОБНОВЛЕНИЕ: согласно подсказке в IDEтег [] позволяет скомпилировать событие как событие метаданных CLI, преобразовав его в пару методов add_ / remove_ ... просто для справки для всех, кого это так же смутило, как и меня.Короче говоря, либо реализация этих двух методов, либо использование этого тега работают нормально, хотя тот факт, что в представлении всплывающей подсказки интерфейса IWdiget отсутствует упоминание о событии Invalidate, и необходимость реализации такого события замечена только тогда, когда компилятор выдаетошибка, все еще явная ошибка и довольно запутанная.Для любого любопытного, следующий код работает отлично:
let invalidated = new DelegateEvent<System.EventHandler>()
interface IWidget with
member w.Evaluate() = new obj()
[<CLIEvent>]
member w.Invalidated = invalidated.Publish
end
Спасибо за помощь всем!