2015-07-21 20 views
5

Es ist allgemein bekannt, dass ich normalen Lambda-Ausdruck zu Expression<T> umwandeln kann:Async Lambda Expression <Func<Task>>

Func<int> foo1 =() => 0; // delegate compiles fine 
Expression<Func<int>> foo2 =() => 0; // expression compiles fine 

Wie kann ich das gleiche tut mit Asynchron-Lambda? Ich habe die folgende Analogie versucht:

Func<Task<int>> bar1 = async() => 0; // also compiles (async lambda example) 
Expression<Func<Task<int>>> bar2 = async() => 0; // CS1989: Async lambda expressions cannot be converted to expression trees 

Gibt es eine mögliche Abhilfe?

+0

Sie nicht Mono.Net Sie würden mit passieren würde? – Cory

+0

Ich habe diesen Fehler von C# 6 Compiler mit frisch freigegebenen VS2015. Ich denke nicht, dass sich diese Situation bei C# 5 und/oder beim Mono-Compiler ändern wird. Wenn es - bitte lass es mich wissen. – ForNeVeR

Antwort

6

C# nur Lambda-Ausdruck auf Expression Baum umwandeln kann nur, wenn Code kann durch den Ausdruck Baum dargestellt werden, wenn Sie feststellen, gibt es kein Äquivalent von „async“ Stichwort in Ausdrücken in System.Linq.Expressions

Also nicht nur async, aber Alles in C#, das in den angegebenen Ausdrücken keinen äquivalenten Ausdruck hat, kann in C# nicht in Expression Tree konvertiert werden.

Andere Beispiele sind

  1. Schloss
  2. unsicher
  3. mit
+1

Gibt es noch weitere Beispiele für solche Sprachkonstrukte mit Ausnahme von 'erwarten' und' yield break/return'? – ForNeVeR

4

Der Fehler ist ziemlich selbsterklärend:

Es ist auch in der Async/Await FAQ dokumentiert "Async Lambda-Ausdrücke können nicht zum Ausdruck Bäume umgewandelt werden".

Und aus gutem Grund ist async-await eine Compiler-Funktion auf dem Framework. Ausdrücke werden verwendet, um Code in andere Befehle (wie SQL) zu übersetzen. Diese anderen Sprachen haben wahrscheinlich kein async-await Äquivalent, so dass es über Ausdrücke nicht sinnvoll erscheint.

Also nein, ich sehe keine Abhilfe.

+1

Nun, das ist ein interessanter Link. Ich weiß nicht, wie ich diese FAQ verpassen könnte. – ForNeVeR

Verwandte Themen