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)?
你可以像这样写:
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中使用它,因为该问题请参阅此已经回答的问题.