我正在尝试弄清楚如何将 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>
这样的输入参数。
我正在尝试弄清楚如何将 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);
}
T : class
到object
存在引用保持转换,因此这是可以的。这是可能的,因为Func<T>
实际上被定义为Func<out T>
,使其具有协变性。Foo((Func<object>)p)
。public delegate TResult Func<TResult>()
,因此它不是协变的。 - dcstraw
Func<T, bool>
来说有些不同,因为 T 是一个输入参数,我们需要进行向下转换,像这样:Func<object, bool> f = value => p((T)value);
。请注意,这可能无法正常工作,因为很可能是Foo
方法提供了输入参数,它可能会失败,因为它可能提供了一个无法转换为我们的T
的object
。 - Steven