Почему событию типа EventCallback <DateTime>может быть присвоено либо void Foo (DateTime dt), либо void Foo ()? - PullRequest
0 голосов
/ 19 июня 2020

Я новичок в веб-сборке Blazor и меня смущает следующее. У меня есть общий компонент с именем Earth.razor

<div>
    <button @onclick=@(() =>OnStop.InvokeAsync(DateTime.Now))>
        Stop Spinning
    </button>
</div>

@code
{
    [Parameter]
    public EventCallback<DateTime> OnStop { get; set; }
}

Я использую Earth.razor на своей странице Index.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> может быть присвоено StopHandler1 и StopHandler2, которые отличаются аргументами.

Вопрос

Почему это возможно?

1 Ответ

2 голосов
/ 19 июня 2020

Следующий ответ не написан в книгах, et c., Это всего лишь предположение, но я считаю, что в некоторой степени, если не для всех, это правда. Однако это, безусловно, правильный ответ на ваш вопрос:

EventCallback - это не тип делегата, а структура, которая создает делегаты по мере необходимости.

Когда вы используете OnStop=StopHandler1 и OnStop=StopHandler2 для EventCallback<DateTime> OnStop 'делегата', оба метода допускаются, хотя их сигнатуры различаются, потому что за кулисами правильный делегат предоставляется системой (I Я не знаком с внутренним устройством Blazor, но это кажется мне очень разумным).

Если вы используете настоящий делегат, такой как делегат Action, использование обоих методов для одного и того же делегата не сработает. Если вы сделаете что-то вроде этого:

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

Это: <Earth OnStop=StopHandler1 /> не будет работать, поскольку подпись метода StopHandler1 не подходит для делегата Action, определенного здесь.

Надеюсь это помогает ...

...