C# LINQ 和 func

Pat*_*ski 2 c# linq lambda func

这是我正在使用的简化版本,只是为了让您知道我想要完成的任务:

public Dictionary<int, Func<int>> Magic(Dictionary<int, int> dictionary)
{
    return dictionary
        .Select(v => new
        {
            key = v.Key,
            function = new Func<int>(() => v.Value + 5)   // *
        })
        .ToDictionary(v => v.key, v => v.function);
}
Run Code Online (Sandbox Code Playgroud)

是否可以将标有(*)的线缩短一些?因为当我尝试删除多余的(在我看来)委托创建时,它会给出错误:

function = () => v.Value + 5   // *
Run Code Online (Sandbox Code Playgroud)

但它不应该给出错误,很清楚返回的类型是什么......

Mar*_*zek 5

Lambda 表达式是无类型的。这就是为什么您必须向编译器添加一些信息来确定它的类型(通过给它们一些上下文)。

请注意,lambda 表达式本身没有类型,因为通用类型系统没有“lambda 表达式”的内在概念。然而,有时非正式地谈论 lambda 表达式的“类型”是很方便的。在这些情况下,类型指的是 lambda 表达式转换为的委托类型或表达式类型。

来自Lambda 表达式(C# 编程指南)

您可以通过将其分配给的变量/参数/属性/字段的类型来执行此操作:

Func<int> func = () => 5;
Run Code Online (Sandbox Code Playgroud)

或者将其投射给委托:

var func = (Func<int>)(() => 5);
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为您可以想象将自己的委托声明为

public delegate int MyDelegate();
Run Code Online (Sandbox Code Playgroud)

编译器如何知道您的匿名类型属性是否应键入为MyDelegateor Func<int>