【问题标题】:Casting Func<T> to Func<object>将 Func<T> 转换为 Func<object>
【发布时间】:2011-07-08 12:58:29
【问题描述】:

我试图弄清楚如何将Func&lt;T&gt; 传递给Func&lt;object&gt; 方法参数:

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&lt;T, bool&gt;

【问题讨论】:

    标签: c# silverlight generics delegates


    【解决方案1】:

    这样就可以了:

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

    【讨论】:

    • 当我有像 Func 这样的输入参数时,情况如何?
    • Func&lt;T, bool&gt; 有点不同,因为 T 有一个输入参数,我们需要进行向下转换,如下所示:Func&lt;object, bool&gt; f = value =&gt; p((T)value);。请注意,这可能无法正常工作,因为它可能是提供输入参数的 Foo 方法并且它可能会失败,因为它可能提供无法转换为我们的 Tobject
    【解决方案2】:

    在面向 .NET 4.0 的 C# 4.0(即具有 variance)中,“原样”很好,因为存在从 T : classobject 的保留引用转换。这是可能的,因为Func&lt;T&gt;实际上定义为Func&lt;out T&gt;,使其成为协变的。

    在 C# 的早期版本中,或针对早期版本的 .NET 的 C# 4.0 中,您需要按照 Steven's answer 进行翻译。

    注意,您需要消除歧义以防止递归!最简单的两个方法名称。或者,Foo((Func&lt;object&gt;)p)

    【讨论】:

    • 出于某种奇怪的原因,它在 .NET4 中有效,但在 Silverlight4 中无效
    • @Alex 真的吗?我很惊讶。老实说。
    • 在 Silverlight 4 中,Func 定义为:public delegate TResult Func&lt;TResult&gt;(),所以它不是协变的
    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    相关资源
    最近更新 更多