Comme il s'agit de l'un des principaux résultats pour "C# lambda ref" sur Google, je pense que je dois développer les réponses ci-dessus. La syntaxe des délégués anonymes plus ancienne (C# 2.0) fonctionne et prend en charge des signatures plus complexes (ainsi que des fermetures). Les lambdas et les délégués anonymes ont au moins une implémentation perçue partagée dans le backend du compilateur (s'ils ne sont pas identiques) - et surtout, ils prennent en charge les fermetures.
Ce que j'essayais de faire quand j'ai fait la recherche, pour démontrer la syntaxe :
public static ScanOperation CreateScanOperation(
PrattTokenDefinition tokenDefinition)
{
var oldScanOperation = tokenDefinition.ScanOperation; // Les fermetures continuent de fonctionner.
return delegate(string text, ref int position, ref PositionInformation currentPosition)
{
var token = oldScanOperation(text, ref position, ref currentPosition);
if (token == null)
return null;
if (tokenDefinition.LeftDenotation != null)
token._led = tokenDefinition.LeftDenotation(token);
if (tokenDefinition.NullDenotation != null)
token._nud = tokenDefinition.NullDenotation(token);
token.Identifier = tokenDefinition.Identifier;
token.LeftBindingPower = tokenDefinition.LeftBindingPower;
token.OnInitialize();
return token;
};
}
Gardez simplement à l'esprit que les Lambdas sont plus sûrs sur le plan procédural et mathématique (en raison de la promotion de la valeur ref mentionnée précédemment) : vous pourriez ouvrir une boîte de Pandore. Réfléchissez bien avant d'utiliser cette syntaxe.
0 votes
Il s'agit d'itérateurs, mais une grande partie du raisonnement dans ce post (également par Eric Lippert — il est bien membre de l'équipe de conception du langage) s'applique également aux lambdas: <blogs.msdn.com/ericlippert/archive/2009/07/13/…>
18 votes
Puis-je demander quelle était la solution de contournement que vous aviez trouvée ?
3 votes
Vous pouvez simplement déclarer une variable normale locale et travailler avec celle-ci, puis attribuer le résultat à la valeur par la suite... Ajoutez une instruction var tempValue = valeur; puis travaillez avec tempValue.
0 votes
L'article auquel fait référence le commentaire de @JoelCoehoorn peut maintenant être trouvé ici