2009-07-02 10 views
1

Je souhaite écrire une expression lambda dans une instruction if if. Mais inline if statement doit avoir des résultats de type forts. Bien sûr, cela ne fonctionne pas, car l'expression de lambda n'est pas fortement typée. J'ai pensé à utiliser Func<intVal, MyType> délégué, pour le rendre fort type.Comment écrire des expressions lambda fortement typées?

Mais comment puis-je utiliser ce Func<> en ligne si? Est-ce possible, est-ce que je devrais définir ma propre fonction à l'extérieur et l'utiliser dans inline if statement?

+0

Eh bien, je ne sais pas ce que vous fera avec votre lambda enregistré (utilisez-le localement ou passez-le à un autre objet/méthode). Si vous n'utilisez que le lambda localement, je suppose que vous devriez être en mesure de faire votre travail avec le mot-clé var. –

+0

J'ai changé mon exemple de code. La chose est que je dois utiliser un constructeur avec des paramètres et également définir une autre propriété. L'initialiseur d'objet n'est donc pas pris en compte. –

+0

Vous pouvez utiliser un constructeur avec des paramètres et définir des propriétés avec une expression d'initialisation d'objet - voir ma réponse par exemple. –

Répondre

6

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 voulez utiliser un lambda cependant, vous pourrait écrire:

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

Cependant, cela est franchement un cauchemar des crochets et jette. 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; 
}); 
6

Cela n'a rien à voir avec le typage de lambda ici. Vous essayez de renvoyer null ou (une fonction ne prenant aucun argument et retournant un MyType) mais vous dites au compilateur que le résultat de cette instruction 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); 
+0

bah, bat moi moi: p Je vais supprimer le mien – Davy8

+0

vérifier le code changé. Je n'ai pas écrit le bon exemple. Le corps de la fonction delegate est plus compliqué que la simple création d'une instance d'objet simple. Désolé. –

1

Si vous avez quelque chose comme ça ...

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

Vous obtiendrez l'erreur ...

« Il est pas de conversion explicite entre l'expression null et l'expression lambda. "

La raison de cela est discutée dans ce SO thread.

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 }; 
Questions connexes