C # - необязательный асинхронный интерфейс - PullRequest
2 голосов
/ 04 апреля 2019

У меня есть два интерфейса:

interface ICommandAsync : ICommand
{
    new Task Run(params string[] args);
}

и

interface ICommand
{
    string Name { get; }
    string Desc { get; }
    void Run(params string[] args);
}

'CommandWeather' не реализует элемент интерфейса 'ICommand.Run (params string [])'.«CommandWeather.Run (строка params [])» не может реализовать «ICommand.Run (строка params [])», поскольку у него нет соответствующего возвращаемого типа «void».

Вот здесь CommandWeather, или класс-нарушитель:

class CommandWeather : ICommandAsync
{
    public async Task Run(params string[] args)
    {
        //...
    }
}

У меня такой вопрос: как я могу сделать интерфейс, который может быть асинхронным?Мне нужно, чтобы методы имели одно и то же имя, так как они оба будут вызываться с Run(), и только несколько реализаций ICommand или ICommandAsync действительно должны использовать async.Это означает, что у меня есть зеленые линии для синхронного асинхронного метода.

1 Ответ

3 голосов
/ 04 апреля 2019

Реализуйте хотя бы один из них явно.

class CommandWeather : ICommandAsync
{
    public async Task Run(params string[] args)
    {
        //...
    }

    // Explicitly implement ICommand.Run
    void ICommand.Run(params string[] args)
    {
        //...
    }
}

Вот как IEnumerator.Current должен быть реализован, поскольку IEnumerator<T>.Current объявлен с new и имеет тип T, а не object.

@ Джонни хорошо отмечает, что асинхронные методы обычно имеют суффикс Async.Это также решило бы проблему.

...