Question

Je veux écrire une expression lambda dans une ligne instruction if. Mais en ligne si la déclaration doit avoir des résultats de type fort.

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

Bien sûr, cela ne fonctionne pas, parce que l'expression lambda n'est pas fortement typé. Je pensais à l'aide de délégué Func<intVal, MyType>, pour le rendre type fort.

Mais comment puis-je utiliser cette ligne si l'intérieur Func<>? Est-il possible de Aurais-je définir ma propre fonction à l'extérieur et de l'utiliser en ligne instruction if?

Était-ce utile?

La solution

Même avec le code plus complexe, vous pouvez utiliser une expression initialiseur d'objet:

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

Si vous vraiment veulent utiliser un lambda cependant, vous pouvez écrire:

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

Cependant, cela est franchement cauchemar des crochets et des moulages. Vous pouvez le rendre plus simple avec une méthode d'assistance:

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

...

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

Autres conseils

Il n'a rien à voir avec la frappe du lambda ici. Vous essayez de retourner soit ou null (fonction sans argument et renvoyant un MyType), mais vous dites au compilateur que le résultat de cette déclaration n'est pas une fonction, mais juste un MyType. Je pense que ce que vous voulez faire est

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

Si vous avez quelque chose comme ça ...

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

Vous obtiendrez l'erreur ...

  

"Il n'y a pas de conversion explicite   entre zéro et l'expression lambda. "

La raison à cela est discuté dans le présent fil de sorte .

Mark est correct sur ce que vous essayez de faire avec l'exemple de code, sauf que vous pouvez définir la propriété dans comme aussi bien comme ça ...

var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top