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?

War es hilfreich?

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 };
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top