Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用lambda而不创建委托;导致需要CS0149方法名称_C#_Lambda - Fatal编程技术网

C# 调用lambda而不创建委托;导致需要CS0149方法名称

C# 调用lambda而不创建委托;导致需要CS0149方法名称,c#,lambda,C#,Lambda,我想创建一个lambda表达式并立即调用它,我想避免创建委托;一个微不足道的例子1: 这将产生以下错误: 需要CS0149方法名称 有两种解决办法: 声明一个(本地)方法: 创建委托: int i = ((Func<int>)(() => 42))(); 使用retrievelookup from faraway类似于: async Task<ILookup<string, int>> RetrieveLookupFromFarAway() {

我想创建一个lambda表达式并立即调用它,我想避免创建委托;一个微不足道的例子1:

这将产生以下错误:

需要CS0149方法名称

有两种解决办法:

  • 声明一个(本地)方法:

  • 创建委托:

    int i = ((Func<int>)(() => 42))();
    
    使用
    retrievelookup from faraway
    类似于:

    async Task<ILookup<string, int>> RetrieveLookupFromFarAway()
    {
        await Task.Delay(1000);
        return Enumerable.Empty<int>().ToLookup((x) => x.ToString());
    }
    
    async Task RetrieveLookupFromFarAway()
    {
    等待任务。延迟(1000);
    返回可枚举的.Empty().ToLookup((x)=>x.ToString());
    }
    

    lambda表达式的概念仅作为源代码存在。它本身甚至没有类型(就像
    null
    literal没有类型一样)。它必须转换为表达式树或委托:就IL和CLR而言,这是存在的。编译器必须发出代码来创建某些东西,并且您需要告诉它您希望它是哪种类型

    编译器不喜欢委托类型:虽然它可以“知道”关于
    Func
    并将其用作不带参数的lambda表达式的默认委托类型,但它不喜欢

    最接近您想要的方法是使用一个方便的方法,您可以调用accepting a
    Func
    ,它可以只返回函数,也可以执行函数并返回结果。例如:

    public static Func<T> CreateFunc<T>(Func<T> func) => func;
    public static T ExecuteFunc<T>(Func<T> func) => func();
    


    问题是
    ()=>42
    可以同时是
    Func
    表达式。这就是您不能使用
    var
    将其分配给变量的原因。@HimBromBeere:或完全不同的委托类型。
    Task<int> future = (async () =>
                           (await RetrieveLookupFromFarAway())["42"].First())();
    
    async Task<ILookup<string, int>> RetrieveLookupFromFarAway()
    {
        await Task.Delay(1000);
        return Enumerable.Empty<int>().ToLookup((x) => x.ToString());
    }
    
    public static Func<T> CreateFunc<T>(Func<T> func) => func;
    public static T ExecuteFunc<T>(Func<T> func) => func();
    
    CreateFunc(() => 42)();
    
    ExecuteFunc(() => 42);