Подтвердить что ты не робот

Невозможно преобразовать из "группы методов" в ошибку "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 не является опцией.

4b9b3361

Ответ 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), поскольку каждая строка есть объект.