9
votes

Y a-t-il des astuces pour utiliser des paramètres 'Out' à l'intérieur de la fonction Lambda?

if ( (new Func</*out*/ string, bool>( (/*out*/ string uname) => ....
more details : that is a part of login function and I just want that my lambda function to changes login-name user with a out parameter and said me that user logined with it's bool return.I really understand that I can return the Tuple and then get my string value but I want exactly out parameter for some personal clarity. I better return only string with null if user is not login, just want to know if I can use out parameters inside lambda functions.And I really get that the code with expressions on the statement places is not so clean But none said me if that is really bad for compiler.

1 commentaires

Remarque, alors que de telles expressions Lambda peuvent avoir réf / out paramètres. Par ex. Cela fonctionne: délégué bool enregistreur (nom de chaîne); Enregistreur f = (barre de string) => {bar = ""; // attribue retour ...}; ..just qui avec action / func vous ne pouvez pas le faire. Vous avez besoin de votre propre délégué.


3 Réponses :


6
votes

lambda expressions em> ne fonctionnera pas, mais pour les délégués, vous devriez bien vouloir utiliser un organisme de déclaration:

public delegate bool MyType(out string value);


7 commentaires

Alors ... je ne voulais vraiment pas utiliser les délégués ici, mais je ne savais même pas si elles peuvent bien fonctionner ici.


Non, vous faire Vous voulez des délégués ici, probablement pas des expressions Lambda.


Ok, oui, je fais :) Si (((nouveau Chuname ((Sortie String Uname) => ... Fonctionne bien.


C'est toujours une Lambda. Vous ne pouvez pas avoir (OUT STRING USNAME) => ... oubliez Lambdas et vient de lire sur l'utilisation de la déléguée de base.


Mais cela fonctionne simplement bien, Chuname est mon délégué, cela peut modifier le nom de mon utilisateur.


@AdamRACKIS Pourquoi oui, vous peut avoir (OUT String USName) => ... , il vous suffit d'avoir un type de délégué dont les correspondances de la signature. (Aucun des types Generic Func et ACTION Types dans le cadre ont OUT Paramètres, ils ne correspondent pas.) Par exemple avec Mytype comme ci-dessus, vous pouvez dire mytype f = (sortie de chaîne u) => {u = "assigné"; retourne vrai; }; . Lorsque out ou ref est appliqué sur certains des paramètres, les types de paramètres (comme ici la chaîne ) doivent être présents. Alors cette variable f est utilisée comme étant exprise: chaîne uname; BOOL Résultat = F (hors d'uname); .


@AdamRACKIS Vous pouvez donc affecter un (OUT String USName) => ... expression à une variable de déléguée de type mytype . Ce que vous ne pouvez pas faire, c'est assigner à un arbre d'expression, comme une variable de type expression .




2
votes

Bien que vous ne puissiez pas utiliser le mot clé OUT, j'ai trouvé une solution qui vous permet d'obtenir essentiellement des pointeurs de mémoire de style C ++ dans .NET. J'ai trouvé cette classe en raison de la Très raison, vous avez ouvert cette question à ne pas pouvoir utiliser un paramètre Out où je le voulais. XXX PRE>

Exemple d'utilisation P>

private IDocumentSession _session = DocumentStore.OpenSession()

var ptr = new Ptr<IDocumentSession>(
                () => _session, 
                newValue => _session = newValue))

session.Deref.SaveChanges();
session.Deref = DocumentStore.OpenSession();


0 commentaires