Verschillen in expressiestructuur tussen C# en VB.Net

Ik heb een bibliotheek die werkt aan expressiestructuren. De bibliotheek moet met zowel C# als VB.Net werken

Heb enkele verschillen opgemerkt tussen de talen over hoe de expressiestructuren zijn geconstrueerd

  • Stringvergelijking
    () => "a" == "b"wordt Expression.Equals("a", "b")
    Function() "a" = "b"wordt Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    (Ik begrijp waarom VB.Net CompareString hier gebruikt)

  • Aaneenschakeling van tekenreeksen
    () => "a" + "b"wordt Expression.Add("a", "b", String.Concat)
    Function() "a" & "b"wordt Expression.Call(String.Concat, "a", "b")

  • Optimalisatie?
    () => !(1 == 2)wordt Expression.Not(Expression.Equals(1, 2))
    Function() Not (1 = 2)wordt Expression.NotEqual(1, 2)

Mijn bibliotheek verwerkt al deze verschillen, maar zijn er meer verschillen waar ik op moet letten?

Bewerken
Enige uitleg over wat mijn code doet.

Het systeem waarmee ik werk heeft een filter voor documenten die u als volgt specificeert:

var filter = document.Filter;
filter.LeftParanthesis();
filter.Column(columnNumber);
filter.Equals();
filter.Value("abc");
filter.RightParanthesis();
filter.And();
filter.LeftParanthesis();
...
document.Refresh();

Om het filter gemakkelijker te kunnen gebruiken, kunt u met mijn code het filter specificeren als een Expression<Func<bool>>lambda.

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

Mijn code herhaalt vervolgens de expressiestructuur en roept de documentfiltermethoden aan zoals hierboven gespecificeerd.
Het filter ondersteunt niet alles wat je in een lambda kunt stoppen. Method-aanroepen is de meest voor de hand liggende.

Aangezien VB.Net in sommige gevallen methodeaanroepen genereert waar C# dat niet doet, hoef ik deze te onderscheppen en ze anders te behandelen.


Antwoord 1, autoriteit 100%

De divisie-operator /werkt anders in C# en VB. In C# past het zich aan de gebruikte datatypes aan, terwijl VB de operanden altijd naar drijvende-kommawaarden converteert:

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

In VB zou je de operator \moeten gebruiken voor deling van gehele getallen en /voor deling met drijvende komma om hetzelfde te krijgen als de /operator in C#.


Antwoord 2, autoriteit 33%

Ik moest met C# en VB.Net werken, wat vaak verband hield met mijn project en de meeste verschillen die ik had gezien toen VB.Net zich in de onveilige modus bevond. dwz als we de VB.Net typesafe maken (Option strict on, option explicite on… option all on) zal het werken als C#.

Other episodes