我正试图找出如何将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>
答案 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 : class
到object
的参考保留转换。这是可能的,因为Func<T>
实际定义为Func<out T>
,使其变得协变。
在以前版本的C#中,或者使用C#4.0定位早期版本的.NET,您需要按照Steven's answer进行翻译。
请注意,您需要消除歧义以防止它被递归!最简单的两个方法名称。或者,Foo((Func<object>)p)
。