Come scrivere fortemente tipizzato espressioni lambda?
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?
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 };