Ответ 1
Это сделает трюк:
public void Foo<T>(Func<T> p) where T : class
{
Func<object> f = () => p();
Foo(f);
}
Я пытаюсь понять, как передать 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>
Это сделает трюк:
public void Foo<T>(Func<T> p) where T : class
{
Func<object> f = () => p();
Foo(f);
}
В С# 4.0 таргетинг .NET 4.0 (т.е. с дисперсией), который является "как есть", поскольку существует преобразование, сохраняющее ссылку, от T : class
до object
. Это возможно, потому что Func<T>
на самом деле определяется как Func<out T>
, что делает его ковариантным.
В предыдущих версиях С# или с С# 4.0, ориентированных на более ранние версии .NET, вам нужно перевести как ответ Стивена.
Заметьте, вам понадобится устранить эту проблему, чтобы она не была рекурсивной! В простейшем, двух именах методов. Или, альтернативно, Foo((Func<object>)p)
.