Pregunta

Quiero escribir una expresión lambda dentro de una línea sentencia if. Pero si en línea declaración debe tener fuertes resultados de tipo.

MyType obj = someObj.IsOk ? null : () => {
   MyType o = new MyType(intVal);
   o.PropertyName = false;
   return o;
};

Por supuesto, esto no funciona, porque la expresión lambda no es inflexible de tipos. Pensé en usar Func<intVal, MyType> delegado, para que sea fuerte tipo.

Pero ¿cómo se utiliza esta línea dentro Func<> si? ¿Es del todo posible de tendría que definir mi propia función fuera y utilizarlo en línea if?

¿Fue útil?

Solución

Incluso con el código más complicado, se puede utilizar una expresión inicializador de objeto:

MyType obj = someObj.IsOk ? null : new MyType(intVal) { ProName = false };

Si realmente que desee utilizar un lambda sin embargo, se podría escribir:

MyType obj = someObj.IsOk ? null : ((Func<MyType>) (() => {
   MyType o = new MyType(intVal);
   o.ProName = false;
   return o;
}))();

Sin embargo, esto es francamente un pesadilla de soportes y yesos. Puede que sea más sencillo con un método de ayuda:

public T Execute(Func<T> func)
{
    return func();
}

...

MyType obj = someObj.IsOk ? null : Execute(() => {
   MyType o = new MyType(intVal);
   o.ProName = false;
   return o;
});

Otros consejos

No tiene nada que ver con la tipificación de la lambda aquí. Usted está tratando de devolver cualquiera null o (una función sin argumentos y devolviendo una MyType), pero le está diciendo al compilador que el resultado de esa declaración no es una función, pero sólo un MyType. Creo que lo que quiere hacer es

MyType obj = someObj.IsOk ? null : new MyType(intVal);

Si usted tiene algo como esto ...

  var obj = (someObj.IsOK) ? null : () => {
             return new MyType(intVal) { PropName =false }; }

Usted recibirá el error ...

  

"No hay conversión explícita   entre nulo y expresión lambda ".

La razón de que se discute en este SO hilo .

Mark es correcta en lo que estás tratando de hacer con el ejemplo de código, excepto en que puede establecer la propiedad de similares, así como este ...

var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top