Warum kann ich Folgendes tun:
%Vor%obwohl das Folgende den Fehler angibt, den ich im Titel angegeben habe:
%Vor%?
Ich verstehe es wirklich nicht.
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:
- 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.
- 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}
- 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 ()}
- Mehrdimensionale Array-Erstellungsausdrücke können nur in konvertiert werden Ausdrucksbäume, wenn sie ihre deklarieren Elementtyp explizit.
- Späte Binding-Ausdrücke können nicht in Ausdrucksbäume konvertiert werden.
- 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.
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.
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:
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.