Dies schlägt fehl
string temp = () => {return "test";};
mit dem Fehler
Der Lambda-Ausdruck kann nicht in den Typ 'string' konvertiert werden, da es sich nicht um einen Delegattyp handelt
Was bedeutet der Fehler und wie kann ich ihn beheben?
Dies schlägt fehl
string temp = () => {return "test";};
mit dem Fehler
Der Lambda-Ausdruck kann nicht in den Typ 'string' konvertiert werden, da es sich nicht um einen Delegattyp handelt
Was bedeutet der Fehler und wie kann ich ihn beheben?
Antworten:
Das Problem hierbei ist, dass Sie eine anonyme Methode definiert haben, die a zurückgibt, string
aber versucht, sie direkt a zuzuweisen string
. Es ist ein Ausdruck, der beim Aufrufen ein string
nicht direktes a erzeugt string
. Es muss einem kompatiblen Delegatentyp zugewiesen werden. In diesem Fall ist die einfachste WahlFunc<string>
Func<string> temp = () => {return "test";};
Dies kann in einer Zeile durch ein wenig Casting oder mithilfe des Delegate-Konstruktors erfolgen, um den Typ des Lambda zu bestimmen, gefolgt von einem Aufruf.
string temp = ((Func<string>)(() => { return "test"; }))();
string temp = new Func<string>(() => { return "test"; })();
Hinweis: Beide Beispiele könnten mit der Ausdrucksform kurzgeschlossen werden, der das fehlt { return ... }
Func<string> temp = () => "test";
string temp = ((Func<string>)(() => "test"))();
string temp = new Func<string>(() => "test")();
Func<string> temp = () => "test";
.
string temp = new Func<string>(() => "test")();
Sie versuchen , einem Zeichenfolgentyp einen Funktionsdelegierten zuzuweisen . Versuche dies:
Func<string> temp = () => {return "test";};
Sie können die Funktion nun folgendermaßen ausführen:
string s = temp();
Die Variable "s" hat jetzt den Wert "test".
Mit ein wenig Hilfsfunktion und Generika können Sie den Compiler auf den Typ schließen lassen und ihn ein wenig verkürzen:
public static TOut FuncInvoke<TOut>(Func<TOut> func)
{
return func();
}
var temp = FuncInvoke(()=>"test");
Randnotiz: Dies ist auch schön, da Sie dann einen anonymen Typ zurückgeben können:
var temp = FuncInvoke(()=>new {foo=1,bar=2});
Sie können eine anonyme Methode mit Argument verwenden:
int arg = 5;
string temp = ((Func<int, string>)((a) => { return a == 5 ? "correct" : "not correct"; }))(arg);
Eine anonyme Methode kann mithilfe eines func-Delegaten einen Wert zurückgeben. Hier ist ein Beispiel, in dem ich gezeigt habe, wie ein Wert mit einer anonymen Methode zurückgegeben wird.
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();
}
}
}
Dies ist ein weiteres Beispiel für die Verwendung von C # 8 ( könnte auch mit anderen .NET-Versionen funktionieren, die parallele Aufgaben unterstützen ).
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();
}
}
}