Невозможно преобразовать из "группы методов" в ошибку "System.Action <object>"
Я создал следующую функцию:
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
не является опцией.
Ответы
Ответ 1
DelegatedCall
ожидает делегата, который принимает любой object
в качестве аргумента. Но ваша функция foo1
, которую вы переходите на DelegatedCall
, может справиться только с аргументом string
. Таким образом, преобразование не является безопасным для типа и, следовательно, невозможно.
Входные параметры contra-variant, но ваш код нуждается в covariance. (См. Разница между ковариацией и Contra-variance.)
Вы можете сделать DelegatedCall
generic:
DelegatedCall<T>(Action<T> action)
... или принять любого делегата:
DelegatedCall(Delegate action)
Но тогда его реализация уродлива и требует отражения. Он также не проверяет, что функция имеет только один параметр во время компиляции.
Ответ 2
Отклонение не работает таким образом; вам понадобится
DelegatedCall(obj => foo1((string)obj));
Как и в 4.0, он не будет считать, что каждый объект является строкой.
Обратите внимание, что если он был foo1(object)
и Action<string>
(т.е. наоборот), он, вероятно, работал бы (в версии 4.0), поскольку каждая строка есть объект.