Ausdruck Baum Unterschiede zwischen C # und VB.Net

c# expression-trees vb.net

Frage

Ich habe eine Bibliothek, die an Expression-Bäumen arbeitet. Die Bibliothek muss mit C # und VB.Net arbeiten

Beachten Sie einige Unterschiede zwischen den Sprachen, wie die Ausdrucksbäume aufgebaut sind

  • String Vergleich
    () => "a" == "b" wird Expression.Equals("a", "b")
    Function() "a" = "b" wird zu Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    (Ich verstehe, warum VB.Net hier CompareString verwendet)

  • String-Verkettung
    () => "a" + "b" wird Expression.Add("a", "b", String.Concat)
    Function() "a" & "b" wird zu Expression.Call(String.Concat, "a", "b")

  • Optimierung?
    () => !(1 == 2) wird zu Expression.Not(Expression.Equals(1, 2))
    Function() Not (1 = 2) wird zu Expression.NotEqual(1, 2)

Meine Bibliothek behandelt all diese Unterschiede, aber gibt es mehr Unterschiede, auf die ich achten muss?

Bearbeiten Einige Erklärungen zu meinem Code.

Das System, mit dem ich arbeite, hat einen Filter für Dokumente, die Sie folgendermaßen 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 zu machen, den Filter zu verwenden, erlaubt Ihnen mein Code, den Filter als Expression<Func<bool>> lambda anzugeben.

Expression<Func<bool>> filter = () => (123.AsStringColumn() == "abc") && (...);
filter.Apply(document);

Mein Code iteriert dann den Ausdrucksbaum und ruft die Dokumentenfiltermethoden wie oben angegeben auf. Der Filter unterstützt nicht alles, was Sie in ein Lambda eingeben können. Methodenaufrufe sind am offensichtlichsten.

Seit VB.Net generiert Methodenaufrufe in einigen Fällen, wo C # nicht muss ich diese abfangen und sie anders behandeln.

Beliebte Antwort

Der / division-Operator arbeitet in C # und VB anders. In C # passt es sich an die verwendeten Datentypen an, während VB die Operanden immer in Fließkommawerte umwandelt:

() => 1 / 2 wird Expression.Divide(1, 2)
Function() 1 / 2 wird zu Expression.Divide(Expression.Convert(1, Double), Expression.Convert(2, Double))

In VB müssten Sie den Operator \ für Ganzzahldivision und / für Gleitkommadivision verwenden, um dasselbe wie den Operator / in C # zu erhalten.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum