将Func <T>传递给Func <object>

Ale*_*sev 16 c# generics silverlight delegates

我想弄清楚如何传递Func<T>给我Func<object>

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

public void Foo(Func<object> p)
{

}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它适用于.NET 4.0类库,但在Silverlight 4类库中不起作用. 实际上我希望它在Silverlight中工作,我有输入参数,如Func<T, bool>

Ste*_*ven 25

这样就可以了:

public void Foo<T>(Func<T> p) where T : class
{
    Func<object> f = () => p();
    Foo(f);
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 11

在C#4.0靶向.NET 4.0(即,具有方差),该细"原样",由于存在从参考保留转换T : classobject.这是可能的,因为Func<T>实际上定义为Func<out T>,使它协变.

在以前版本的C#中,或者使用C#4.0定位早期版本的.NET,您需要根据Steven的回答进行翻译.

请注意,您需要消除歧义以防止它递归!最简单的两个方法名称.或者,Foo((Func<object>)p).

  • 在Silverlight 4中,Func定义为:`public delegate TResult Func <TResult>()`,因此它不是协变的 (3认同)