web-dev-qa-db-ja.com

無名メソッドで値を返す方法は?

これは失敗します

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

エラーあり

ラムダ式はデリゲート型ではないため、「string」型に変換できません

エラーは何を意味し、どのように解決できますか?

77
4thSpace

ここでの問題は、stringを返す匿名メソッドを定義したが、それをstringに直接割り当てようとしていることです。これは、呼び出されたときにstringを生成する式であり、直接stringではありません。互換性のあるデリゲートタイプに割り当てる必要があります。この場合、最も簡単な選択はFunc<string>です

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

これは、少しキャストするか、デリゲートコンストラクターを使用してラムダの型を確立し、呼び出しを行うことで1行で実行できます。

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")();
117
JaredPar

関数デリゲートを文字列型に割り当てようとしています。これを試して:

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

これで関数を実行できます:

string s = temp();

「s」変数の値は「test」になります。

14
Dave Swersky

小さなヘルパー関数とジェネリックを使用すると、コンパイラに型を推測させ、少し短くすることができます。

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

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

サイドノート:匿名型を返すことができるので、これも素晴らしいです:

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

引数付きの匿名メソッドを使用できます:

int arg = 5;

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

匿名メソッドは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();
        }
    }
}
2
Debendra Dash