Como escrever expressões lambda rigidez?
Pergunta
Eu quero escrever uma expressão lambda dentro de uma linha if. Mas em linha if deve ter resultados tipo forte.
MyType obj = someObj.IsOk ? null : () => {
MyType o = new MyType(intVal);
o.PropertyName = false;
return o;
};
É claro que isso não funciona, porque a expressão lambda não é fortemente tipado. Pensei em usar delegado Func<intVal, MyType>
, para torná-lo tipo forte.
Mas como faço para usar esta Func<>
dentro em linha se? É de todo possível de que eu teria que definir a minha própria função fora e usá-lo na linha if?
Solução
Mesmo com o código mais complicado, você pode usar um objeto initializer expressão:
MyType obj = someObj.IsOk ? null : new MyType(intVal) { ProName = false };
Se você realmente quiser usar um lambda, porém, você poderia escrever:
MyType obj = someObj.IsOk ? null : ((Func<MyType>) (() => {
MyType o = new MyType(intVal);
o.ProName = false;
return o;
}))();
No entanto, este é francamente um pesadelo de suportes e moldes. Você pode torná-lo mais simples com um método auxiliar:
public T Execute(Func<T> func)
{
return func();
}
...
MyType obj = someObj.IsOk ? null : Execute(() => {
MyType o = new MyType(intVal);
o.ProName = false;
return o;
});
Outras dicas
Não tem nada a ver com a digitação do lambda aqui. Você está tentando retornar tanto null
ou (uma função que não recebe argumentos e retornando a MyType), mas você está dizendo ao compilador que o resultado de que a declaração não é uma função, mas apenas um MyType. Eu acho que o que você quer fazer é
MyType obj = someObj.IsOk ? null : new MyType(intVal);
Se você tem algo assim ...
var obj = (someObj.IsOK) ? null : () => {
return new MyType(intVal) { PropName =false }; }
Você vai obter o erro ...
"Não há nenhuma conversão explícita entre nulo e expressão lambda ".
A razão para isso é discutido neste SO fio .
Mark está correta sobre o que você está tentando fazer com o exemplo de código, exceto que você pode definir a propriedade em como bem assim ...
var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };