Ich habe eine Bibliothek, die an Ausdrucksbäumen arbeitet. Die Bibliothek benötigenUnterschiede in der Ausdrucksbaumstruktur zwischen C# und VB.Net
sowohl mit C# und VB.Net arbeitenBemerkt einige Unterschiede zwischen den Sprachen, wie die Ausdrucksbäume
String Vergleich
() => "a" == "b"
konstruiert sind, wirdExpression.Equals("a", "b")
Function() "a" = "b"
Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
wird (Ich verstehe, warum VB.Net CompareString hier verwendet)Str ing Verkettung
() => "a" + "b"
wirdExpression.Add("a", "b", String.Concat)
Function() "a" & "b"
Expression.Call(String.Concat, "a", "b")
Optimierung wird?
() => !(1 == 2)
wirdExpression.Not(Expression.Equals(1, 2))
Function() Not (1 = 2)
wirdExpression.NotEqual(1, 2)
Meine Bibliothek alle diese Unterschiede behandeln aber gibt es mehr Unterschiede, die ich brauche zu achten?
Bearbeiten Einige Erklärung, was mein Code tut.
Das System mit dem ich arbeite hat einen Filter für Dokumente, die Sie wie folgt angeben:
var filter = document.Filter;
filter.LeftParanthesis();
filter.Column(columnNumber);
filter.Equals();
filter.Value("abc");
filter.RightParanthesis();
filter.And();
filter.LeftParanthesis();
...
document.Refresh();
Um es einfacher, den Filter zu verwenden, um meine Code, den Sie den Filter als Expression<Func<bool>>
Lambda angeben können.
Mein Code iteriert dann den Ausdrucksbaum und ruft die Dokumentfiltermethoden wie oben angegeben auf. Der Filter unterstützt nicht alles, was Sie in ein Lambda eingeben können. Methodenaufrufe sind am offensichtlichsten.
Da VB.Net Methodenaufrufe in einigen Fällen erzeugt, wo C# Ich brauche nicht diese abzufangen und sie anders zu behandeln.
Captured-Variablen, Anonym-Typen und Opaque-Identifier ('Let') brauchen wahrscheinlich etwas Liebe; Ich vermute, dass dies offen ist, obwohl –
@Marc Die Benennung ist wahrscheinlich anders, aber erwarten Sie, dass der Baum auch anders aussieht? – adrianm
Achten Sie auf implizite Konvertierungen mit 'Option strict off 'in VB.NET. Nicht wirklich ein Unterschied per se, da C# es nicht unterstützt, aber es könnte zusätzliche Anrufe einführen, die Sie interessieren könnten. –