В C # 4.0 для .NET 4.0 (т. Е. С дисперсией ) все в порядке, как есть, поскольку существует преобразование с сохранением ссылок из T : class
в object
. Это возможно, потому что Func<T>
является на самом деле , определенным как Func<out T>
, что делает его ковариантным.
В предыдущих версиях C # или с C # 4.0, ориентированным на более ранние версии .NET, вам необходимо выполнить перевод в соответствии с ответом Стивена .
обратите внимание, вам понадобится устранение неоднозначности, чтобы предотвратить его рекурсивность! Самое простое, два имени метода. Или, альтернативно, Foo((Func<object>)p)
.