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)
但它不应该给出错误,很清楚返回的类型是什么......
Lambda 表达式是无类型的。这就是为什么您必须向编译器添加一些信息来确定它的类型(通过给它们一些上下文)。
请注意,lambda 表达式本身没有类型,因为通用类型系统没有“lambda 表达式”的内在概念。然而,有时非正式地谈论 lambda 表达式的“类型”是很方便的。在这些情况下,类型指的是 lambda 表达式转换为的委托类型或表达式类型。
您可以通过将其分配给的变量/参数/属性/字段的类型来执行此操作:
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>?
| 归档时间: |
|
| 查看次数: |
1377 次 |
| 最近记录: |