これは失敗します
string temp = () => {return "test";};
エラーで
デリゲート型ではないため、ラムダ式を 'string' 型に変換できません
エラーの意味と解決方法を教えてください。
ここでの問題は、 を返す匿名メソッドを定義した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")();
関数デリゲートを文字列型に割り当てようとしています。これを試して:
Func<string> temp = () => {return "test";};
次のように関数を実行できます。
string s = temp();
「s」変数の値は「test」になります。
小さなヘルパー関数とジェネリックを使用して、コンパイラに型を推測させ、少し短くすることができます。
public static TOut FuncInvoke<TOut>(Func<TOut> func)
{
return func();
}
var temp = FuncInvoke(()=>"test");
補足:これは、匿名型を返すことができるため、これも優れています。
var temp = FuncInvoke(()=>new {foo=1,bar=2});
引数で匿名メソッドを使用できます:
int arg = 5;
string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg);
これは、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();
}
}
}