属性'Context'是F#中的静态错误

GSP*_*ler 1 c# f# static-members akka.net

我有一个问题,从C#到F#重写Akka.Net演员:

public class Listener : ReceiveActor
{
    public Listener()
    {
        Receive<Messages.Shutdown>(s =>
        {
            Console.WriteLine($"shutdown {s.Duration}");
            Context.System.Terminate();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

Actor应该通过终止actor系统来处理Shutdown消息.我试图像这样重新实现它:

type Listener() =
    inherit ReceiveActor()
    do
        base.Receive<Messages>(fun m -> 
            match m with 
            | Shutdown(duration) -> 
                printf "shutdown %s" (duration.ToString())
                base.Context.System.Terminate()
                true
            | _ -> false)
Run Code Online (Sandbox Code Playgroud)

但是有一个补充错误在线base.Context.System.Terminate()Property 'Context' is static.这段代码有什么问题?为什么我不能访问基类的静态属性?是因为这段代码是lambda expresion(有趣)吗?或者因为它在构造函数中(do)?

Gus*_*Gus 5

你可以像这样写:

type Listener() =
    inherit ReceiveActor()
    do
        base.Receive<Messages>(fun m -> 
            match m with 
            | Shutdown(duration) -> 
                printf "shutdown %s" (duration.ToString())
                ReceiveActor.Context.System.Terminate()
                true
            | _ -> false)
Run Code Online (Sandbox Code Playgroud)

请注意,在这里您可以使用function而不是match... with:

        base.Receive<Messages>(function 
            | Shutdown(duration) -> 
Run Code Online (Sandbox Code Playgroud)

那么printfn相当于WriteLine和这个:

printfn "shutdown %s" (duration.ToString())
Run Code Online (Sandbox Code Playgroud)

是相同的:

printfn "shutdown %O" duration
Run Code Online (Sandbox Code Playgroud)

UPDATE

如果它是一个静态属性,如您的错误消息所示,您不能在lambda中使用它,因为该问题请参阅已经回答的问题.