Wie schreibt man stark Lambda-Ausdrücke eingegeben?
Frage
Ich will if-Anweisung einen Lambda-Ausdruck innerhalb eines Inline schreiben. Aber Inline-if-Anweisung muss stark Typ Ergebnisse haben.
MyType obj = someObj.IsOk ? null : () => {
MyType o = new MyType(intVal);
o.PropertyName = false;
return o;
};
Natürlich funktioniert das nicht, weil Lambda-Ausdruck nicht stark typisiert wird. Ich dachte an Func<intVal, MyType>
Delegierten verwenden, um es stark Art.
Aber wie verwende ich diese Func<>
innerhalb Inline-if? Ist es überhaupt möglich wäre ich habe meine eigene Funktion außerhalb zu definieren und verwenden Sie es in der Inline-if-Anweisung?
Lösung
Auch bei dem komplizierteren Code, können Sie ein Objekt initializer Ausdruck verwenden:
MyType obj = someObj.IsOk ? null : new MyType(intVal) { ProName = false };
Wenn Sie wirklich will allerdings ein Lambda verwenden, könnten Sie schreiben:
MyType obj = someObj.IsOk ? null : ((Func<MyType>) (() => {
MyType o = new MyType(intVal);
o.ProName = false;
return o;
}))();
Dies ist jedoch offen ein Albtraum von Klammern und Würfen. Sie können es einfacher, mit einem Helfer-Methode machen:
public T Execute(Func<T> func)
{
return func();
}
...
MyType obj = someObj.IsOk ? null : Execute(() => {
MyType o = new MyType(intVal);
o.ProName = false;
return o;
});
Andere Tipps
Es hat nichts mit der Lambda-typing hier zu tun. Sie versuchen entweder null
oder (eine Funktion ohne Argumente und eine MyType Rückkehr) zurückzukehren, aber Sie sagen dem Compiler, dass das Ergebnis dieser Anweisung ist keine Funktion, sondern nur ein MyType. Ich denke, was Sie tun möchten, ist
MyType obj = someObj.IsOk ? null : new MyType(intVal);
Wenn Sie so etwas wie dieses ...
var obj = (someObj.IsOK) ? null : () => {
return new MyType(intVal) { PropName =false }; }
Sie werden die Fehler ...
"Es gibt keine explizite Konvertierung zwischen null und Lambda-Ausdruck. "
Der Grund dafür ist in diesem SO fädeln.
Mark ist richtig auf, was Sie versuchen, mit dem Codebeispiel zu tun, außer Sie die Eigenschaft in wie auch wie folgt gesetzt werden kann ...
var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };