DelegatedCall
ожидает делегата, который принимает любой object
в качестве аргумента.Но ваша функция foo1
, которую вы передаете DelegatedCall
, может справиться только с аргументом string
.Таким образом, преобразование не является типобезопасным и, следовательно, невозможно.
Входные параметры контр-вариант , но ваш код требует ковариационной .(См. Разница между ковариацией и контрастной дисперсией .)
Вы можете сделать DelegatedCall
универсальным:
DelegatedCall<T>(Action<T> action)
... или сделать так, чтобы любой участник:
DelegatedCall(Delegate action)
Но тогда его реализация уродлива и требует размышлений.Он также не проверяет, что функция имеет только один параметр во время компиляции.