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