我正在尝试编写以下代码:
var name = "Kyle";
var sayHello = () => $"Hello, {name}";
Console.WriteLine(sayHello());
但我得到了错误:
Feature 'inferred delegate type' is not available in C# 9.0.
这意味着什么?我该如何解决?
问题
问题是实际的lambda表达式本身() => $"Hello, {name}"
实际上没有类型(但(。
只有当它被转换为时,它才会被键入
- 类型为
Func
或Action
的委托 - 或者
Expression
类型的表达式树(然后可以将其编译为委托(
C#10中的解决方案
C#10对lambda进行了一些改进,包括推断出的委托类型,这意味着C#现在可以确定(推断(lambda将用作委托函数,因此在升级到C#10时可以使用原始语法:
var sayHello = () => $"Hello, {name}";
以前的解决方案
如果不能升级到C#10,有几种方法可以显式键入lambda。
您可以提供显式类型,而不是使用var
:
Func<string> sayHello = () => $"Hello, {name}";
或者,您可以使用func构造函数来键入表达式:
var sayHello = new Func<string>(() => $"Hello, {name}");
.NetFiddle中的演示
进一步阅读
- 委托关键字与lambda表示法
- 如何使用匿名方法返回值