En general, cuando se utiliza el operador condicional, aquí es la sintaxis:¿Cómo puedo asignar un Func <> condicionalmente entre lambdas usando el operador ternario condicional?
int x = 6;
int y = x == 6 ? 5 : 9;
No es nada especial, bastante sencillo.
Ahora, intentemos usar esto cuando asignamos un Lambda a un tipo de Func. Me explico:
Func<Order, bool> predicate = id == null
? p => p.EmployeeID == null
: p => p.EmployeeID == id;
Esa es la misma sintaxis, y debe trabajo? ¿Derecha? Por alguna razón, eso no. El compilador da este bonito mensaje críptico:
de error 1 Tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre 'expresión lambda' y 'expresión lambda'
luego me fui por delante y cambiado la sintaxis y de esta manera se hizo trabajo:
Func<Order, bool> predicate = id == null
? predicate = p => p.EmployeeID == null
: predicate = p => p.EmployeeID == id;
Tengo curiosidad de por qué no funciona el primer camino?
(Nota al margen: Terminé no necesitar este código, como descubrí que al comparar un valor int contra nula, sólo tiene que utilizar Object.equals)
me pregunto, si el compilador puede inferir lo siguiente: 'Func predicado = p => p.EmployeeID == id', ¿cómo es que tiene problemas para inferir lo siguiente:' Func predicado = id == null ? (Func ) (p => p.EmployeeID == null) : p => p.EmployeeID == id; '? Quiero decir que conoce el tipo que se necesita para el segundo y tercer operandos a través de la declaración de 'predicado'. –
GDS
@GDS: hay una conversión implícita de la expresión lambda al tipo de delegado, por lo que la primera versión funciona. Pero la declaración de 'predicado' no afecta la inferencia de tipo para la expresión condicional. La especificación del lenguaje básicamente dice que el tipo de expresión condicional debe ser deducible solo a través de los operandos. –
Entonces me pregunto, ¿por qué el operador ternario tendría tal requisito? Es solo una asignación condicional del segundo o tercer operando a una variable o una evaluación condicional de una expresión. A menos que me falta algo, cualquier inferencia lograda con una asignación o evaluación directa debería ser plausible con la asignación o evaluación condicional también. Además, si un operante es ambiguo, la inferencia del otro podría resolver la ambigüedad. Si la ambigüedad no se puede resolver, el compilador puede presentar una queja como en el ejemplo anterior. Tal vez una característica omitida ...? – GDS