VB.NET: "Statement-Lambdas können nicht in Ausdrucksbäume umgewandelt werden" Kompilierzeitfehler

8

Warum kann ich Folgendes tun:

%Vor%

obwohl das Folgende den Fehler angibt, den ich im Titel angegeben habe:

%Vor%

?

Ich verstehe es wirklich nicht.

    
Rémy Esmery 18.02.2011, 00:46
quelle

2 Antworten

7

Dies ist in Abschnitt 11.1 der VB.NET 10 Language Specification angegeben:

  

Die exakte Übersetzung zwischen Lambda   Methoden und Ausdrucksbäume dürfen nicht   zwischen Versionen der   Compiler und geht über den Umfang von   diese Spezifikation. Für Microsoft   Visual Basic 10.0, alle Lambda   Ausdrücke können in konvertiert werden   Ausdruck Bäume unterliegen der   Folgende Einschränkungen:

     
  1. Nur einzeilige Lambda-Ausdrücke ohne ByRef-Parameter   kann in Ausdrucksbäume umgewandelt werden.   Von den Single-Line-Sub-Lambdas nur   Aufrufanweisungen können konvertiert werden   zu Ausdrucksbäumen.
  2.   
  3. Anonyme Ausdrücke können nicht in Ausdrucksbäume umgewandelt werden, wenn ein   früherer Feldinitialisierer wird verwendet   initialisiere ein nachfolgendes Feld   Initialisierer, z.B. Neu Mit {.a = 1,   .b = .a}
  4.   
  5. Objektinitialisiererausdrücke können nicht in Ausdruck konvertiert werden   Bäume, wenn ein Mitglied der aktuellen   Objekt, das initialisiert wird, wird in verwendet   einer der Feldinitialisierer, z.B.   Neu C1 Mit {.a = 1, .b = .Method1 ()}
  6.   
  7. Mehrdimensionale Array-Erstellungsausdrücke können nur in konvertiert werden   Ausdrucksbäume, wenn sie ihre deklarieren   Elementtyp explizit.
  8.   
  9. Späte Binding-Ausdrücke können nicht in Ausdrucksbäume konvertiert werden.
  10.   
  11. Wenn eine Variable oder ein Feld ByRef an einen Aufruf übergeben wird   Ausdruck hat aber nicht genau   der gleiche Typ wie der ByRef-Parameter,   oder wenn eine Eigenschaft ByRef übergeben wird,   normale VB-Semantik ist, dass eine Kopie von   Das Argument wird ByRef und seine übergeben   Der endgültige Wert wird dann zurück in kopiert   die Variable oder das Feld oder die Eigenschaft. Im   Ausdrucksbäume, tut der Rückkopierer   nicht passieren.
  12.   

Alle diese Einschränkungen gelten für verschachtelt   Lambda-Ausdrücke.

Es ist die Einschränkung in dem ersten Element, auf die Sie stoßen. Die Einführung lässt viel Raum für die Annahme, dass in zukünftigen Releases daran gearbeitet wird, natürlich gibt es viel zu gewinnen. Connect.microsoft.com ist ein guter Ort, um sie zu ermutigen. Ich konnte nicht überprüfen, ob bereits ein Feedback-Element dafür geöffnet wurde, die Seite ist gerade auf der Fritz.

    
Hans Passant 18.02.2011, 02:46
quelle
11

VB.Net unterstützt zwei Arten von Lambda-Ausdrücken:

  • Ausdruck lambdas enthält einen einzelnen Ausdruck und gibt den Ausdruck implizit zurück.
    Zum Beispiel: Function(x) x.ToString()

  • Statement-Lambdas enthalten eine oder mehrere Anweisungen und müssen explizit das Schlüsselwort Return verwenden (wenn sie einen Wert zurückgeben)
    Diese sind neu in VB.Net 2010.
    Zum Beispiel:

    %Vor%

Die Methode Where und alle anderen Methoden IQueryable nehmen Ausdrucksbäume .
Der Compiler kann automatisch Ausdruck Lambdas, aber keine Anweisungslambdas in Ausdrucksbäume kompilieren.

Ihr zweites Beispiel versucht, eine Anweisung Lambda als Expression(Of Func(Of T, Boolean)) zu übergeben, aber der Compiler kann das nicht tun.

    
SLaks 18.02.2011 00:56
quelle

Tags und Links