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?

Foi útil?

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 };
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top