Невозможно преобразовать из группы методов в ошибку System.Action <object> - PullRequest
41 голосов
/ 16 января 2011

Я создал следующую функцию:

public void DelegatedCall(Action<Object> delegatedMethod)

И определен следующий метод

public void foo1(String str) { }

Однако, когда я пытаюсь позвонить DelegateCall с foo1:

DelegatedCall(foo1);

... Я получаю следующую ошибку компилятора:

Argument 1: cannot convert from 'method group' to 'System.Action<object>'

В чем причина этой ошибки и как я могу ее исправить? К сожалению, приведение foo1 к Action не вариант.

Ответы [ 2 ]

28 голосов
/ 16 января 2011

DelegatedCall ожидает делегата, который принимает любой object в качестве аргумента.Но ваша функция foo1, которую вы передаете DelegatedCall, может справиться только с аргументом string.Таким образом, преобразование не является типобезопасным и, следовательно, невозможно.

Входные параметры контр-вариант , но ваш код требует ковариационной .(См. Разница между ковариацией и контрастной дисперсией .)

Вы можете сделать DelegatedCall универсальным:

DelegatedCall<T>(Action<T> action)

... или сделать так, чтобы любой участник:

DelegatedCall(Delegate action)

Но тогда его реализация уродлива и требует размышлений.Он также не проверяет, что функция имеет только один параметр во время компиляции.

10 голосов
/ 16 января 2011

Дисперсия не работает таким образом; вам понадобится

DelegatedCall(obj => foo1((string)obj));

Как и в 4.0, он не верит, что каждый объект является строкой.

Обратите внимание, что если бы это были foo1(object) и Action<string> (т.е. наоборот), то, вероятно, сработало бы (в 4.0), поскольку каждая строка является объектом.

...