programa parentesis llaves corchetes analizador c# .net asp.net-web-api

c# - programa analizador de parentesis, llaves y corchetes "(){}[] " c++



Explica 2 pares de paréntesis en expresión.Compilar()() (2)

¿Podría por favor explicar qué hace este extraño código?

expression.Compile()();

¿Por qué hay 2 pares de paréntesis aquí? No encontré nada en google. El método completo es

public Validator NotEmpty(Expression<Func<IEnumerable<T>>> expression) { var member = (MemberExpression)expression.Body; string propertyName = member.Member.Name; IEnumerable<T> value = expression.Compile()(); if (value == null || !value.Any()) { ValidationResult.AddError(propertyName, "Shouldn''t be empty"); } return this; }

Se usa así:

_validator.NotEmpty(() => request.PersonIds); // request.PersonIds is List<int>

Este método comprueba si una colección está vacía o nula. Todo funciona bien, pero estoy un poco confundido con ese código. Nunca he visto usar 2 pares de paréntesis antes en C #. Qué significa eso?


Bueno, pasas la lista de int en el método como árbol de expresiones. Esta expresión produce el valor de IEnumerable<T> (en este caso IEnumerable<int> ).

Para obtener el valor de la expresión, debe compilar esta expresión en un delegado Func<IEnumerable<T>> y luego invocar al delegado. De hecho, puedo escribir dos líneas de código separadas en lugar de la sintaxis más corta utilizada anteriormente:

Func<IEnumerable<T>> del = expression.Compile(); IEnumerable<T> value = del();


Los dos corchetes () son en realidad un operador que invoca un método o un delegado. Ver here

La expresión "expresión.Compilar ()" parece entregar un delegado que se puede invocar. El segundo par de paréntesis invoca a este delegado.

También podrías reescribir esto como:

var del = expression.Compile(); del();