96

これは失敗します

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

エラーで

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

エラーの意味と解決方法を教えてください。

4

6 に答える 6

142

ここでの問題は、 を返す匿名メソッドを定義した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")();
于 2012-05-09T17:14:20.123 に答える
18

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

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

次のように関数を実行できます。

string s = temp();

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

于 2012-05-09T17:15:45.200 に答える
8

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

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

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

補足:これは、匿名型を返すことができるため、これも優れています。

var temp = FuncInvoke(()=>new {foo=1,bar=2});
于 2013-06-05T04:05:44.870 に答える
6

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

int arg = 5;

string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg);
于 2016-01-09T08:31:24.827 に答える
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();
        }
    }
}
于 2020-04-29T23:34:31.777 に答える