将Func <t>传递给Func <object> </object> </t>

时间:2011-07-08 12:58:29

标签: c# silverlight generics delegates

我正试图找出如何将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 个答案:

答案 0 :(得分:25)

这样可以解决问题:

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

答案 1 :(得分:11)

在针对.NET 4.0的C#4.0中(即使用 variance ),“按原样”很好,因为存在从T : classobject的参考保留转换。这是可能的,因为Func<T> 实际定义为Func<out T>,使其变得协变。

在以前版本的C#中,或者使用C#4.0定位早期版本的.NET,您需要按照Steven's answer进行翻译。

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