Différences de l'arbre d'expression entre C # et VB.Net

c# expression-trees vb.net

Question

J'ai une bibliothèque qui travaille sur les arbres d'expression. La bibliothèque doit fonctionner avec C # et VB.Net

Remarqué quelques différences entre les langages sur la construction des arbres d'expression

  • Comparaison de chaîne
    () => "a" == "b" devient Expression.Equals("a", "b")
    Function() "a" = "b" devient Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    (Je comprends pourquoi VB.Net utilise CompareString ici)

  • Concaténation de chaînes
    () => "a" + "b" devient Expression.Add("a", "b", String.Concat)
    Function() "a" & "b" devient Expression.Call(String.Concat, "a", "b")

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

Ma bibliothèque gère toutes ces différences, mais y a-t-il d'autres différences que je devrais rechercher?

Edit Une explication de ce que fait mon code.

Le système avec lequel je travaille a un filtre pour les documents que vous spécifiez comme ceci:

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

Pour faciliter l'utilisation du filtre, mon code vous permet de spécifier le filtre sous la forme Expression<Func<bool>> lambda.

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

Mon code itère ensuite l'arborescence des expressions et appelle les méthodes de filtrage de document comme spécifié ci-dessus. Le filtre ne prend pas en charge tout ce que vous pouvez mettre dans un lambda. Les appels de méthode sont les plus évidents.

Étant donné que VB.Net génère des appels de méthode dans certains cas où C # ne l’est pas, j’ai besoin de les intercepter et de les traiter différemment.

Réponse populaire

L'opérateur / division fonctionne différemment en C # et en VB. En C #, il s’adapte aux types de données utilisés, alors que VB convertit toujours les opérandes en valeurs à virgule flottante:

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

En VB, vous devez utiliser l'opérateur \ pour la division entière et / pour la division à virgule flottante pour obtenir le même résultat que l'opérateur / en C #.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi