C# 这是在代理之间转换代理的正确方式吗?

C# 这是在代理之间转换代理的正确方式吗?,c#,asynchronous,C#,Asynchronous,我试图将自定义委托作为Task.Run的输入,但因为Task.Run只接受Action和Func作为形式参数,所以我将自定义委托变量更改为适当的Func变量,以便将此Func变量指定给Task.Run方法。我使用的转换方式是 Del mydel = new Del(Get10); Func<int> xx = new Func<int>(mydel); int p = await Task.Run(xx); 这就是在代

我试图将自定义委托作为Task.Run的输入,但因为Task.Run只接受Action和Func作为形式参数,所以我将自定义委托变量更改为适当的Func变量,以便将此Func变量指定给Task.Run方法。我使用的转换方式是

        Del mydel = new Del(Get10);
        Func<int> xx = new Func<int>(mydel);
        int p = await Task.Run(xx);  
这就是在代理之间进行强制转换的方式,还是有其他常见的方法

using System;
using System.Diagnostics;
using System.Threading.Tasks;

namespace ConsoleApplication25
{
class Program
{
    public delegate int Del();

    public static int Get10()
    {
        return 10;
    }

    public async Task DoAsync()
    {
        Del mydel = new Del(Get10);
        Func<int> xx = new Func<int>(mydel);
        int p = await Task.Run(xx);  

        Console.WriteLine("{0}", p);
    }

    static void Main(string[] args)
    {
        Task t = new Program().DoAsync();
        t.Wait();
    }
}
}

委托之间的转换是什么,您只是使用委托对象作为对具有匹配签名的Func委托的引用,现在发生的是Func Delegate,而不是调用方法,而是调用内部调用方法的委托,因此是一个额外级别的间接寻址,没有实现这样的目的。它就像一个指向指针的指针,而实际上您可以引用主引用/指针

查看以下代码:

你的版本

以下步骤也将起作用

您要求的是演员:

Func<int> xx = (Func<int>) mydel;

这将不起作用,因为Func委托和定义的其他自定义委托之间没有类型兼容性

为什么不只是int p=await Task.RunGet10?为什么会有多个代理?Task.Run=>xx?@PanagiotisKanavos我正在尝试学习在相同的签名代理之间进行转换,因此我创建了这个示例来教自己如何进行转换。正常情况下,正如你所说的,这可能是最短的路线。@jenson button事件为什么甚至是xx?它只是包装上的一个包装,它包装了实际的function@Lyrk为什么首先需要在代表之间进行投票?把兰姆达递给我。你想干什么?如果你真的需要一个Func委托,为什么要通过mydel呢?同样为了验证我提到的,检查编译代码的IL,你会知道在你的代码中Func如何调用MyDelegate,它在内部调用方法,而在其他情况下,我提供的方法直接被调用
Func<int> xx = new Func<int>(Get10);
Func<int> xx = Get10;
Func<int> xx = (Func<int>) mydel;