Реализация C# EventHandlers в F#

У меня есть интерфейс, записанный в 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

Спасибо за всю справку все!

7
задан lvilnis 15 July 2010 в 00:59
поделиться