Контравариантные параметры? - PullRequest
2 голосов
/ 20 декабря 2010

Это, вероятно, глупый вопрос, но у меня есть метод, который я использую, чтобы сделать синтаксис страницы немного более легким для чтения

    public void Do(Delegate method, DispatcherPriority priority = DispatcherPriority.Normal)
    {
        this.Window.Dispatcher.BeginInvoke(method, DispatcherPriority.Background);
    }

тогда я могу написать

        Do(new Action(() =>
        {
            //DoStuff()
        }));

Однако я бы хотел переместить действие вверх в метод Do, чтобы я мог написать более просто:

        Do(() =>
        {
            //DoStuff()
        }));

Но я немного уверен, как написать контравариантный параметр для метода Do?

1 Ответ

4 голосов
/ 20 декабря 2010

Лямбды нетипизированы, поэтому это невозможно.

Если вас не интересуют аргументы метода, как представляется, почему бы не изменить сигнатуру метода на:

public void Do(Action method,
               DispatcherPriority priority = DispatcherPriority.Normal)

Тогда второй пример будет работать нормально, так как компилятор сможет неявно преобразовывать лямбду в Action.

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

...