create c# vb.net expression-trees

create - Diferencias en el árbol de expresiones entre C#y VB.Net



lambda c# (2)

El operador / division funciona de manera diferente en C # y VB. En C # se adapta a los tipos de datos utilizados, mientras que VB siempre convierte los operandos a valores de coma flotante:

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

En VB necesitaría usar el operador / para la división de enteros y / para la división de coma flotante para obtener lo mismo que el operador / en C #.

Tengo una biblioteca trabajando en árboles de expresiones. La biblioteca necesita trabajar con C # y VB.Net

Notó algunas diferencias entre los idiomas sobre cómo se construyen los árboles de expresión

  • Comparación de cadenas
    () => "a" == "b" convierte en Expression.Equals("a", "b")
    Function() "a" = "b" convierte en Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    (Entiendo por qué VB.Net usa CompareString aquí)

  • Concatenación de cadenas
    () => "a" + "b" convierte en Expression.Add("a", "b", String.Concat)
    Function() "a" & "b" convierte en Expression.Call(String.Concat, "a", "b")

  • ¿Mejoramiento?
    () => !(1 == 2) convierte en Expression.Not(Expression.Equals(1, 2))
    Function() Not (1 = 2) convierte en Expression.NotEqual(1, 2)

Mi biblioteca maneja todas estas diferencias, pero ¿hay más diferencias que debo tener en cuenta?

Editar Alguna explicación de lo que hace mi código.

El sistema con el que trabajo tiene un filtro para documentos que especifiques así:

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

Para facilitar el uso del filtro, mi código le permite especificar el filtro como una Expression<Func<bool>> lambda.

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

Mi código itera el árbol de expresiones y llama a los métodos de filtro de documentos como se especifica arriba. El filtro no tiene soporte para todo lo que puedes poner en una lambda. Llamadas a métodos es la más obvia.

Como VB.Net genera llamadas de método en algunos casos donde C # no es necesario, debo interceptarlos y manejarlos de manera diferente.


Tuve que trabajar con C # y VB.Net frecuentemente relacionados con mi proyecto y la mayoría de las diferencias que había visto cuando VB.Net está en modo inseguro. es decir, si hacemos VB.Net typesafe (Option strict on, option explicite on ... opción all on) funcionará como C #.