2012-05-09 10 views

Antwort

95

Das Problem hier ist, dass Sie eine anonyme Methode definiert haben, die eine string zurückgibt, aber versuchen, sie direkt einer string zuzuordnen. Es ist ein Ausdruck, der, wenn er aufgerufen wird, string erzeugt, ist es nicht direkt ein string. Es muss einem kompatiblen Delegattyp zugewiesen werden. In diesem Fall ist die einfachste Wahl ist Func<string>

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

Dies wird durch ein wenig Gießen in einer Zeile durchgeführt werden kann oder der Delegat Konstruktor mit der Art des Lambda durch einen Aufruf gefolgt zu etablieren.

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

Hinweis: Die beiden Proben könnten auf die Ausdrucksform kurzgeschlossen werden, die die { return ... }

Func<string> temp =() => "test"; 
string temp = ((Func<string>)(() => "test"))(); 
string temp = new Func<string>(() => "test")(); 
+0

Danke. Also keine Möglichkeit, alles in einer Zeile zu machen (einschließlich String zuweisen)? Der Wert, den ich haben will ("test", was tatsächlich eine Variable im wirklichen Leben ist), ist in einem anderen Lambda, also verliere ich den Umfang, wenn ich versuche, wie oben beschrieben zu definieren. – 4thSpace

+0

@ 4thSpace es kann in einer Linie mit einigen bösen Casting getan werden. Ich habe meine Antwort aktualisiert, um den Weg zu zeigen – JaredPar

+0

Oder in diesem Fall nur 'Func temp =() =>" test ";'. – Gabe

12

Sie versuchen, fehlt eine Funktion delegieren in einen String Typ zuordnen. Versuchen Sie folgendes:

string s = temp(); 

Das "s" Variable wird nun den Wert "Test" haben:

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

Sie nun die Funktion thusly ausführen kann.

+1

Dies kompiliert nicht: "Kann nicht zu einer implizit typisierten lokalen Variablen Lambda-Ausdruck zuweisen" –

+0

@Dave: Interessant, wusste nicht über diese Einschränkung. Aktualisiert, danke! –

6

eine kleine Hilfsfunktion und die Verwendung von Generika können Sie lassen der Compiler den Typ ableiten, und verkürzen sie ein wenig:

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

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

Side Hinweis: Dies ist auch schön, wie Sie dann in der Lage sind eine anonyme zurückkehren Typ:

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

Interessante Technik. Fügt dies Laufzeit-Overhead hinzu oder ist das alles zur Kompilierzeit? – ToolmakerSteve

3

Sie anonyme Methode mit dem Argument verwenden:

int arg = 5; 

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

Sie können, aber bitte erläutern, wie dies eine Antwort auf die Frage ist. – ToolmakerSteve

1

Eine anonyme Methode kann einen Wert mithilfe der Funktion deligate zurückgeben. Hier ist das Beispiel, wo ich gezeigt habe, wie man einen Wert mit ananomous Methode zurückgibt.

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(); 
     } 
    } 
} 
Verwandte Themen