Передача Func <T> в Func <объект>

Я пытаюсь понять, как передать Func<T> в Func<object>

public void Foo<T>(Func<T> p) where T:class
{
    Foo(p);
}

public void Foo(Func<object> p)
{

}

Странная вещь, она работает в библиотеке классов NET 4.0, но не работает в библиотеке классов Silverlight 4. На самом деле я хочу, чтобы он работал в Silverlight, и у меня есть параметры ввода, такие как Func<T, bool>

Ответы

Ответ 1

Это сделает трюк:

public void Foo<T>(Func<T> p) where T : class
{
    Func<object> f = () => p();
    Foo(f);
}

Ответ 2

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

В предыдущих версиях С# или с С# 4.0, ориентированных на более ранние версии .NET, вам нужно перевести как ответ Стивена.

Заметьте, вам понадобится устранить эту проблему, чтобы она не была рекурсивной! В простейшем, двух именах методов. Или, альтернативно, Foo((Func<object>)p).