Warum kann eine anonyme Methode in C # keine yield-Anweisung enthalten?
Ich dachte, es wäre schön, so etwas zu tun (mit der lambda zu tun eine Rendite):
public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
IList<T> list = GetList<T>();
var fun = expression.Compile();
var items = () => {
foreach (var item in list)
if (fun.Invoke(item))
yield return item; //This is not allowed by C#
}
return items.ToList();
}
Allerdings fand ich heraus, dass ich nicht verwenden können, die Ausbeute in der anonymen Methode. Ich Frage mich, warum. Die Ausbeute docs nur sagen, es ist nicht erlaubt.
Da war es nicht erlaubt ich gerade erstellten Liste Hinzugefügt und die Elemente.
InformationsquelleAutor der Frage Lance Fisher | 2009-08-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eric Lippert schrieb vor kurzem eine Reihe von blog-posts über, warum die Ausbeute ist nicht erlaubt in einigen Fällen.
EDIT2:
Wahrscheinlich werden Sie dort die Antwort finden...
EDIT1: dies wird erklärt in den Kommentaren von Teil 5, in der Eric 's Antwort auf Abhijeet Patel' s Kommentar:
Q :
A :
InformationsquelleAutor der Antwort Thomas Levesque
Eric Lippert hat geschrieben eine exzellente Serie von Artikeln über die Grenzen (und design-Entscheidungen beeinflussen die Entscheidungen) auf iterator-Blöcke
Insbesondere iterator-Blöcke implementiert sind einige ausgefeilte compiler-code-Transformationen. Diese Veränderungen auswirken würden mit den Veränderungen, die passieren, inside anonyme Funktionen oder Lambda-Ausdrücke, so dass unter bestimmten Umständen würden Sie versuchen, sowohl auf 'konvertieren' den code in ein anderes Konstrukt, welches nicht kompatibel mit den anderen.
Als Ergebnis sind Sie verboten von Interaktion.
Wie iterator-Blöcke arbeiten unter der Haube ist behandelt mit gut hier.
Als ein einfaches Beispiel für eine Unvereinbarkeit:
Ist der compiler gleichzeitig zu wollen, konvertieren Sie diese zu etwas wie:
und gleichzeitig den iterator Aspekt ist versuchen zu tun, ist es Arbeit zu machen, eine kleine state-Maschine. Bestimmte einfache Beispiele könnten arbeiten mit einem fairen Betrag von sanity-Check (erste beschäftigt sich mit der (möglicherweise willkürlich nexted Verschlüsse) dann sehen, wenn die ganz unteren Ebene, die resultierenden Klassen transformiert werden kann in iterator-state-machines.
Dies würde jedoch
In deinem Beispiel etwa so:
InformationsquelleAutor der Antwort ShuggyCoUk
Leider weiß ich nicht, warum Sie nicht zulassen, denn natürlich ist es durchaus möglich, zu tun, sich vorstellen, wie das funktionieren würde.
Jedoch, anonyme Methoden sind bereits ein Stück von "compiler-Magie" in dem Sinne, dass die Methode extrahiert werden, die entweder auf eine Methode in der vorhandenen Klasse, oder sogar eine ganz neue Klasse, je nachdem, ob es sich mit lokalen Variablen oder nicht.
Darüber hinaus iterator-Methoden mit
yield
ist auch implementiert, mithilfe von compiler-magic.Meine Vermutung ist, dass einer der beiden macht den code un-identifizierbaren, um das andere Stück der Magie, und so wurde beschlossen, nicht verbringen Zeit auf diese Arbeit für die aktuellen Versionen der C# - compiler. Natürlich, es ist vielleicht nicht eine bewusste Wahl, und dass es einfach nicht funktioniert, weil niemand dachte, es zu implementieren.
Für eine 100% genaue Frage, die ich schlage vor, Sie verwenden die Microsoft Connect Website und Bericht-eine Frage, ich bin sicher, Sie bekommen etwas Verwertbares zurück.
InformationsquelleAutor der Antwort Lasse Vågsæther Karlsen
Ich würde dies tun:
Natürlich müssen Sie die System.Core.dll auf die dort verwiesen wird .NET 3.5, für Linq-Methode. Und beinhalten:
Cheers,
Sly
InformationsquelleAutor der Antwort