Differenze tra gli alberi delle espressioni tra C # e VB.Net

c# expression-trees vb.net

Domanda

Ho una biblioteca che lavora su alberi di espressione. La libreria deve funzionare con C # e VB.Net

Ho notato alcune differenze tra le lingue su come sono costruiti gli alberi di espressione

  • Confronto di stringhe
    () => "a" == "b" diventa Expression.Equals("a", "b")
    Function() "a" = "b" diventa Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    (Capisco perché VB.Net utilizza CompareString qui)

  • Concatenazione di stringhe
    () => "a" + "b" diventa Expression.Add("a", "b", String.Concat)
    Function() "a" & "b" diventa Expression.Call(String.Concat, "a", "b")

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

La mia biblioteca gestisce tutte queste differenze, ma ci sono più differenze che devo cercare?

Modifica Alcune spiegazioni su cosa fa il mio codice.

Il sistema con cui lavoro ha un filtro per i documenti che si specifica in questo modo:

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

Per rendere più facile l'uso del filtro, il mio codice consente di specificare il filtro come Expression<Func<bool>> lambda.

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

Il mio codice quindi itera l'albero delle espressioni e chiama i metodi di filtro del documento come sopra specificato. Il filtro non ha supporto per tutto ciò che puoi inserire in una lambda. Il metodo delle chiamate è il più ovvio.

Poiché VB.Net genera chiamate di metodo in alcuni casi in cui C # non ha bisogno di intercettarle e gestirle in modo diverso.

Risposta popolare

L'operatore / divisione funziona in modo diverso in C # e VB. In C # si adatta ai tipi di dati utilizzati, mentre VB converte sempre gli operandi in valori in virgola mobile:

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

In VB dovresti usare l'operatore \ per divisione intera e / per divisione in virgola mobile per ottenere lo stesso come / operatore in C #.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché