¿Cómo puedo asignar un Func condicionalmente entre lambdas usando el operador ternario condicional?

Generalmente, cuando se usa el operador condicional, aquí está la syntax:

int x = 6; int y = x == 6 ? 5 : 9; 

Nada elegante, bastante directo.

Ahora, intentemos usar esto cuando asignamos un Lambda a un tipo de Func. Dejame explicar:

 Func predicate = id == null ? p => p.EmployeeID == null : p => p.EmployeeID == id; 

Esa es la misma syntax, y debería funcionar? ¿Derecha? Por alguna razón, eso no. El comstackdor da este agradable mensaje críptico:

Error 1 El 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 seguí adelante y cambié la syntax y de esta manera funcionó:

 Func predicate = id == null ? predicate = p => p.EmployeeID == null : predicate = p => p.EmployeeID == id; 

Tengo curiosidad de por qué no funciona de la primera manera?

(Nota al margen: terminé sin necesitar este código, ya que descubrí que al comparar un valor int con nulo, solo usa object.Equals)

Puede convertir una expresión lambda en un tipo particular de delegado objective, pero para determinar el tipo de expresión condicional, el comstackdor necesita saber el tipo de cada uno de los operandos segundo y tercero. Si bien ambos son solo “expresión lambda”, no hay conversión de uno a otro, por lo que el comstackdor no puede hacer nada útil.

Sin embargo, no recomendaría usar una tarea: un reparto es más obvio:

 Func predicate = id == null ? (Func) (p => p.EmployeeID == null) : p => p.EmployeeID == id; 

Tenga en cuenta que solo necesita proporcionarlo para un operando, por lo que el comstackdor puede realizar la conversión desde la otra expresión lambda.

El comstackdor de C # no puede inferir el tipo de la expresión lambda creada porque procesa el ternario primero y luego la asignación. también podrías hacer:

 Func predicate = id == null ? new Func(p => p.EmployeeID == null) : new Func(p => p.EmployeeID == id); 

pero eso apesta, también podrías probar

 Func predicate = id == null ? (Order p) => p.EmployeeID == null : (Order p) => p.EmployeeID == id; 

Permítanme tener mi propio ejemplo ya que también tuve el mismo problema (con la esperanza de que el ejemplo sea útil para otros):

Mi método Find es un método genérico que obtiene Expression> como predicado y da List como salida.
Quería encontrar países, pero los necesito todos si la lista de idiomas estaba vacía, y la lista filtrada, si la lista de idiomas estaba completa. Primero utilicé el Código de la siguiente manera:

 var countries= Find(languages.Any() ? (country => languages.Contains(country.Language)) : (country => true)); 

Pero exactamente obtengo el error: there is no implicit conversion between lambda expression and lambda expression.

El problema es que tenemos solo dos expresiones lambda aquí, y nada más, por ejemplo, ¿qué es country => true exactamente? Tenemos que determinar el tipo de al menos una de las expresiones lambda . Si solo se determina una de las expresiones, entonces se omitirá el error. Pero para hacer el código más legible, extraje ambas expresiones lambda y usé la variable en su lugar, como se muestra a continuación:

  Expression> getAllPredicate = country => true; Expression> getCountriesByLanguagePredicate = country => languages.Contains(country.Language); var countries= Find(languages.Any() ? getCountriesByLanguagePredicate : getAllPredicate); 

Insisto en que, si acabo de determinar el tipo de expresión, el error será reparado.