为什么 EventCallback 类型的事件可以分配 void Foo(<DateTime>DateTime dt) 或 void Foo()?



我是 Blazor webassembly 的新手,对以下内容感到困惑。 我有一个名为Earth.razor的共享组件

<div>
<button @onclick=@(() =>OnStop.InvokeAsync(DateTime.Now))>
Stop Spinning
</button>
</div>
@code
{
[Parameter]
public EventCallback<DateTime> OnStop { get; set; }
}

我在Index.razor页面中使用Earth.razor,如下所示。

@page "/"
The earth stopped spinning at @(dt.ToString("hh:mm:ss")).
<Earth OnStop=StopHandler1 />
<Earth OnStop=StopHandler2 />
@code{
private DateTime dt = DateTime.Now;
private void StopHandler1()
{
this.dt = DateTime.Now;
}
private void StopHandler2(DateTime dt)
{
this.dt = dt;
}
}

在这里OnStop可以分配EventCallback<DateTime>类型的事件,也可以分配参数不同的StopHandler1StopHandler2

问题

为什么可能?

下面的答案不是写在书本等,只是猜测,但我相信它在某种程度上是正确的,如果不是全部的话。但是,这肯定是您问题的正确答案:

EventCallback 不是委托类型,而是根据需要生成委托的结构。

当你对EventCallback<DateTime> OnStop"委托"使用OnStop=StopHandler1OnStop=StopHandler2时,这两种方法都是可以容忍的,尽管它们的签名不同,因为在后台,系统提供了正确的委托(我不熟悉 Blazor 的内部结构,但在我看来这非常合理(。

如果使用真正的委托(如操作委托(,则对同一委托使用这两种方法将不起作用。如果你做这样的事情:

[Parameter]
public Action<DateTime> OnStop { get; set; }

这:<Earth OnStop=StopHandler1 />不起作用,因为 StopHandler1 方法的签名不适合此处定义的操作委托。

希望这有帮助...

最新更新