如何使用匿名方法返回值?

4th*_*ace 79 .net c# lambda

这失败了

string temp = () => {return "test";};
Run Code Online (Sandbox Code Playgroud)

有错误

无法将lambda表达式转换为类型'string',因为它不是委托类型

错误是什么意思,我该如何解决?

Jar*_*Par 120

这里的问题是你已经定义了一个匿名方法,它返回一个string但是试图直接将它分配给一个string.它是一个表达式,当被调用时产生string它不是直接的a string.需要将其分配给兼容的委托类型.在这种情况下,最简单的选择是Func<string>

Func<string> temp = () => {return "test";};
Run Code Online (Sandbox Code Playgroud)

这可以通过一些转换或使用委托构造函数在一行中完成,以建立lambda的类型,然后进行调用.

string temp = ((Func<string>)(() => { return "test"; }))();
string temp = new Func<string>(() => { return "test"; })();
Run Code Online (Sandbox Code Playgroud)

注意:两个样本都可以缩短为缺少表达式的表达式 { return ... }

Func<string> temp = () => "test";
string temp = ((Func<string>)(() => "test"))();
string temp = new Func<string>(() => "test")();
Run Code Online (Sandbox Code Playgroud)


Dav*_*sky 15

您正在尝试将函数委托分配给字符串类型.试试这个:

Func<string> temp = () => {return "test";};
Run Code Online (Sandbox Code Playgroud)

您现在可以执行该功能:

string s = temp();
Run Code Online (Sandbox Code Playgroud)

"s"变量现在将具有值"test".


joe*_*iks 8

使用一个小辅助函数和泛型,你可以让编译器推断出类型,并稍微缩短一下:

public static TOut FuncInvoke<TOut>(Func<TOut> func)
{
    return func();
}

var temp = FuncInvoke(()=>"test");
Run Code Online (Sandbox Code Playgroud)

旁注:这也很好,因为您可以返回匿名类型:

var temp = FuncInvoke(()=>new {foo=1,bar=2});
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用带有参数的匿名方法:

int arg = 5;

string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg);
Run Code Online (Sandbox Code Playgroud)