2013-04-19 6 views
49

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 arbeiten

Bemerkt einige Unterschiede zwischen den Sprachen, wie die Ausdrucksbäume

  • String Vergleich
    () => "a" == "b" konstruiert sind, wird Expression.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" wird Expression.Add("a", "b", String.Concat)
    Function() "a" & "b"Expression.Call(String.Concat, "a", "b")

  • Optimierung wird?
    () => !(1 == 2) wird Expression.Not(Expression.Equals(1, 2))
    Function() Not (1 = 2) wird Expression.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.

+20

Captured-Variablen, Anonym-Typen und Opaque-Identifier ('Let') brauchen wahrscheinlich etwas Liebe; Ich vermute, dass dies offen ist, obwohl –

+0

@Marc Die Benennung ist wahrscheinlich anders, aber erwarten Sie, dass der Baum auch anders aussieht? – adrianm

+3

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. –

Antwort

6

Der / Divisions-Operator funktioniert anders in C# und VB. In C# paßt sie an die verwendeten Datentypen, während VB immer die Operanden zu Gleitkommawerte konvertiert:

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

In VB müssen Sie den \ Operator für Integer-Division verwenden und / für die Gleitkommadivision, um den gleichen Operator wie / in C# zu bekommen.

+0

Danke. Ich denke, der beste Weg (für mich), damit umzugehen, ist, es in der Konvertierungsfehlermeldung zu erwähnen. – adrianm

+0

@DaveMarkle: Was? – Guffa

+1

Entschuldigung. Die Eigenheiten von VB machen mich wahnsinnig - ich meine - einen Rückwärtsslash? Uck! –

2

Ich hatte mit C# und VB.Net häufig im Zusammenhang mit meinem Projekt und die meisten Unterschiede arbeiten ich gesehen hatte, als VB.Net in unsicherem Modus ist. dh wenn wir die VB machen.Net typesafe (Option strict on, Option explicite on ... Option all on) funktioniert wie C#.

Verwandte Themen