Lambdas verlassen sich nicht auf irgendwelche der neueren Rahmeneigenschaften. Ein Lambda, am Ende des Tages, muss nur in der Lage sein, eine neue Klasse mit Feldern, Methoden und Konstruktoren zu erstellen, die alle im 1.0-Runtime/Framework verfügbar sind.
Der folgende Code:
public class SomeRandomCompilerGeneratedNameGoesHere
{
public int value;
public int SomeGeneratedMethodName()
{
//the content of the anonymous method goes here
return value;
}
}
Und wird verwendet werden, etwa so::
int value = 42;
MyDelegate f =() => value;
Wird in einen neuen Namen Typ umgewandelt werden
var closureClass = new SomeRandomCompilerGeneratedNameGoesHere();
closureClass.value = 42;
MyDelegate f = closureClass.SomeGeneratedMethodName;
Nun gibt es ein einige Situationen, die nicht alles erfordern; Wenn keine geschlossenen Werte vorhanden sind, können einige dieser Schritte angeregt und Optimierungen hinzugefügt werden (dh die Methode kann statisch gemacht werden, um die Erzeugung einer Objektinstanz zu vermeiden), aber die hier gezeigte Transformation kann jedes gültige C# Lambda abbilden und wie Sie sehen können, wäre der Code, in den er umgewandelt wurde, auch in C# 1.0 gültig.
Sie sind anonyme Delegierte. Delegierte sind seit 1.0 da und "anonym" bedeutet einfach "der Name wird vom Compiler zugewiesen" – dman2306
@ dman2306 Nein, Lambdas werden nicht in anonyme Methoden kompiliert. Beide Funktionen sind in herkömmlichen Code zusammengefasst. – Servy
@ dman2306 VB.NET enthält keine anonymen Delegaten. –