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

时间:2012-05-09 17:12:57

标签: c# .net lambda

这失败

string temp = () => {return "test";};

错误

  

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

错误意味着什么,我该如何解决?

6 个答案:

答案 0 :(得分:116)

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

Func<string> temp = () => {return "test";};

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

string temp = ((Func<string>)(() => { return "test"; }))();
string temp = new Func<string>(() => { return "test"; })();

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

的表达式
Func<string> temp = () => "test";
string temp = ((Func<string>)(() => "test"))();
string temp = new Func<string>(() => "test")();

答案 1 :(得分:13)

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

Func<string> temp = () => {return "test";};

您现在可以执行该功能:

string s = temp();

“s”变量现在将具有值“test”。

答案 2 :(得分:7)

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

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

var temp = FuncInvoke(()=>"test");

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

var temp = FuncInvoke(()=>new {foo=1,bar=2});

答案 3 :(得分:3)

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

int arg = 5;

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

答案 4 :(得分:1)

匿名方法可以使用func委托返回值。 这是一个示例,其中我展示了如何使用匿名方法返回值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {


        static void Main(string[] args)
        {
            Func<int, int> del = delegate (int x)
              {
                  return x * x;

              };

            int p= del(4);
            Console.WriteLine(p);
            Console.ReadLine();
        }
    }
}

答案 5 :(得分:0)

这是使用 C#8 的另一个示例(也可以与其他支持并行任务的.NET版本一起使用

using System;
using System.Threading.Tasks;

namespace Exercise_1_Creating_and_Sharing_Tasks
{
    internal static class Program
    {
        private static int TextLength(object o)
        {
            Console.WriteLine($"Task with id {Task.CurrentId} processing object {o}");
            return o.ToString().Length;
        }

        private static void Main()
        {
            const string text1 = "Welcome";
            const string text2 = "Hello";

            var task1 = new Task<int>(() => TextLength(text1));
            task1.Start();

            var task2 = Task.Factory.StartNew(TextLength, text2);

            Console.WriteLine($"Length of '{text1}' is {task1.Result}");
            Console.WriteLine($"Length of '{text2}' is {task2.Result}");

            Console.WriteLine("Main program done");
            Console.ReadKey();
        }
    }
}