无法在F#中使用受保护的事件

时间:2014-12-28 16:49:06

标签: f#

假设我们有以下C#类

public class Class1
{
    protected event EventHandler ProtectedEvent;
    protected virtual void OverrideMe() { }
}

似乎无法在F#中使用ProtectedEvent。

type HelpMe() as this =
    inherit Class1()

    do
        printfn "%A" this.ProtectedEvent        

    member x.HookEvents() =
        printfn "%A" x.ProtectedEvent

    member private x.HookEvents2() =
        printfn "%A" x.ProtectedEvent 

    override x.OverrideMe() =
        printfn "%A" x.ProtectedEvent 

在这个例子中,我试图在其上调用printfn,因为有多种方法可以在F#中连接事件,我想清楚这只是导致问题的事件的引用

在上述每种情况下,编译器都会抱怨以下错误

  

正在调用受保护的成员或正在使用“base”。这只是   允许直接实施成员,因为他们可以   逃避他们的对象范围。

我理解这个错误,是什么导致它及其目的。通常,解决方法是将调用包装在私有成员中,该方法适用于方法 - 但这似乎不适用于事件。无论我尝试什么,似乎都不可能在F#中使用受保护的事件,除非我采用反射做某事,或者对基类做一些更改(在我的情况下是不可能的)。

请注意,我还尝试了使用basethisx的所有可能组合。

我做错了吗?

1 个答案:

答案 0 :(得分:3)

我怀疑编译器在场景后面生成的代码有一些东西,当你将事件视为一个后来混淆它的第一类值时(即一些隐藏的lambda函数使编译器认为它无法访问受保护的会员)。我会说这是一个错误。

据我所知,您可以直接使用add_ProtectedEventremove_ProtectedEvent成员解决问题(他们不会在自动完成时显示,但它们在那里且可以访问 - 它们是保护,但调用它们是一个直接的方法调用,这很好):

type HelpMe() =
    inherit Class1()

    member x.HookEvents() =
        let eh = System.EventHandler(fun _ _ -> printfn "yay")
        x.add_ProtectedEvent(eh)

    override x.OverrideMe() =
        printfn "hello"

这对我来说很好。遗憾的是,您不能将受保护的事件用作一等值,但这至少可以让您使用它......