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.
3 Réponses :
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);
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 I> 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 i> avoir (OUT String USName) => ... code>, il vous suffit d'avoir un type de délégué dont les correspondances de la signature. (Aucun des types Generic
Func CODE> et
ACTION CODE> Types dans le cadre ont
OUT CODE> Paramètres, ils ne correspondent pas.) Par exemple avec
Mytype code> comme ci-dessus, vous pouvez dire
mytype f = (sortie de chaîne u) => {u = "assigné"; retourne vrai; }; code>. Lorsque
out code> ou
ref code> est appliqué sur certains des paramètres, les types de paramètres (comme ici la chaîne
code>) doivent être présents. Alors cette variable
f code> est utilisée comme étant exprise:
chaîne uname; BOOL Résultat = F (hors d'uname); code>.
@AdamRACKIS Vous pouvez donc affecter un (OUT String USName) => ... code> expression à une variable de déléguée de type
mytype code>. Ce que vous ne pouvez pas faire, c'est assigner à un arbre d'expression, comme une variable de type
expression
Vous ne pouvez pas utiliser les paramètres avec une expression Lambda. Voir . P>
Un peu déroutant. Vous pouvez avoir une Lambda comme (int i, out int j) => ... code>, avec le mot clé code> dedans CODE> dedans, et que Lamda peut être attribué à une variable de type délégué. Cela ne peut pas être attribué à un arbre d'expression, cependant. La question que vous référez, parle de capturer un paramètre code> code> d'une méthode régulière à l'intérieur d'une Lambda. C'est comme
Static Static Bool Usualmethod (OUT INT I) {/ * Corps de méthode normale * / action f = () => {console.writine (i); }; ... ...} code>. Ceci i> b> est illégal. La Lambda tente de capturer un paramètre code> code> de la méthode contenant.
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. 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();
Remarque, alors que de telles expressions Lambda peuvent avoir
réf / out code> paramètres. Par ex. Cela fonctionne:
délégué bool enregistreur (nom de chaîne); Enregistreur f = (barre de string) => {bar = ""; // attribue retour ...}; code> ..just qui avec
action / func code> vous ne pouvez pas le faire. Vous avez besoin de votre propre délégué.