Передать Func <T>в Func <object> - PullRequest
16 голосов
/ 08 июля 2011

Я пытаюсь выяснить, как передать 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>

Ответы [ 2 ]

25 голосов
/ 08 июля 2011

Это поможет:

public void Foo<T>(Func<T> p) where T : class
{
    Func<object> f = () => p();
    Foo(f);
}
11 голосов
/ 08 июля 2011

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

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

обратите внимание, вам понадобится устранение неоднозначности, чтобы предотвратить его рекурсивность! Самое простое, два имени метода. Или, альтернативно, Foo((Func<object>)p).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...