Warum kann ein Ausdrucksbaum keine benannte Argumentspezifikation enthalten?

c# c#-4.0 expression-trees

Frage

Mit AutoMapper habe ich einen Platz gefunden, an dem ein benanntes Argument sehr gut gepasst hätte:

.ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyProperty(s, isAdvanced: false)))

Aber der Compiler schrie mich an:

Ein Ausdrucksbaum darf keine benannte Argumentspezifikation enthalten

Also musste ich zurückkehren zu:

.ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyProperty(s, false)))

Weiß jemand, warum der Compiler in dieser Situation benannte Argumente nicht zulässt?

Akzeptierte Antwort

Folgendes berücksichtigen:

static int M() { Console.Write("M"); return 1; }
static int N() { Console.Write("N"); return 2; }
static int Q(int m, int n) { return m + n; }
...
Func<int> f = ()=>Q(n : N(), m: M());
Expression<Func<int>> x = ()=>Q(n : N(), m: M());
Func<int> fx = x.Compile();
Console.WriteLine(f());
Console.WriteLine(fx());

Du stimmst zu Ich hoffe, dass die letzten beiden Zeilen genau dasselbe tun müssen, richtig? Welches ist zum Drucken von NM3 .

Nun, welche Ausdrucksbaumbibliotheks-Aufrufe würden Sie gerne für die Generierung der Ausdrucksbaumstruktur verwenden, um dies sicherzustellen? Da sind keine! Wir stehen daher vor folgenden Entscheidungen:

  1. Implementieren Sie das Feature in der Ausdrucksbaumbibliothek. Fügen Sie eine Transformation in der Ausdrucksbaumstruktur hinzu, die die Engine verringert, die die Reihenfolge der Ausführung der benannten Argumente beibehält. Implementieren Sie Code in der Compile Methode, die die Ausführungsreihenfolge berücksichtigt.
  2. Machen Sie x = ()=>Q(n : N(), m: M()); tatsächlich implementiert werden als x = ()=>Q(M(), N()); und mit der Nicht-Ausdruck-Baum-Version inkompatibel sein.
  3. Verhindern Sie benannte Argumente in Ausdrucksbäumen. Implementieren Sie eine entsprechende Fehlermeldung.

(1) ist schön, aber teuer. (2) ist ein Nichtstarter; Wir können diese Art von "Gotcha" nicht mit gutem Gewissen einführen. (3) ist billig, aber irritierend.

Wir haben (3) gewählt.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow