Domanda

Voglio scrivere un'espressione lambda all'interno di una linea if. Ma in linea if deve avere risultati di tipo forti.

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

Naturalmente questo non funziona, perché espressione lambda non è fortemente tipizzato. Ho pensato di utilizzare Func<intVal, MyType> delegato, per renderlo di tipo forte.

Ma come faccio a usare questo Func<> dentro in linea, se? È a tutto il possibile avrei dovuto definire la mia propria funzione al di fuori e utilizzarlo in linea if?

È stato utile?

Soluzione

Anche con il codice più complicato, è possibile utilizzare l'espressione di inizializzazione degli oggetti:

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

Se davvero si desidera utilizzare una lambda, però, si potrebbe scrivere:

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

Tuttavia, questo è francamente un incubo di staffe e calchi. È possibile rendere più semplice con un metodo di supporto:

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

...

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

Altri suggerimenti

Non ha nulla a che fare con la digitazione del lambda qui. Si sta tentando di tornare sia null o (una funzione di prendere senza argomenti e la restituzione di un MyType), ma si sta dicendo al compilatore che il risultato di questa affermazione non è una funzione, ma solo un MyType. Penso che ciò che si vuole fare è

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

Se hai qualcosa di simile ...

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

Si otterrà l'errore ...

  

"Non c'è conversione esplicita   tra nullo ed espressione lambda ".

La ragione di ciò è discusso in questo SO filo .

Mark è corretta su quello che si sta cercando di fare con il codice di esempio, ad eccezione è possibile impostare la proprietà dentro come pure così ...

var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top