2010-10-13 29 views
19

Je suis intéressé s'il est possible en utilisant C# pour écrire un code analogue à ce Javascript un:Comment appeler une fonction anonyme en C#?

var v = (function() 
{ 
    return "some value"; 
})() 

Le plus que je pouvais réaliser est:

Func<string> vf =() => 
{ 
    return "some value"; 
}; 

var v = vf(); 

Mais je voulais quelque chose comme ceci:

// Gives error CS0149: Method name expected 
var v = (() => 
{ 
    return "some value"; 
})(); 

Existe-t-il un moyen d'appeler la fonction en la laissant anonyme?

+1

Pouvez-vous dire exactement ce que vous voulez faire avec le code? Quelle est l'entrée et la sortie désirées? –

+5

@Ahmad: La question est complètement claire et sans ambiguïté. – Timwi

+0

Pouvez-vous expliquer pourquoi vous voulez faire cela? Pourquoi passer par tout le rigamarole de définir une fonction anonyme et l'invoquer quand vous pourriez simplement placer le corps de la fonction anonyme * juste là et il serait invoqué quand le code court? –

Répondre

30

Oui, mais C# est typé statiquement, vous devez donc spécifier un type de délégué.

Par exemple, en utilisant la syntaxe du constructeur:

var v = new Func<string>(() => 
{ 
    return "some value"; 
})(); 

// shorter version 
var v = new Func<string>(() => "some value")(); 

... ou la syntaxe de fonte, ce qui peut être gênant avec trop de parenthèses :)

var v = ((Func<string>) (() => 
{ 
    return "some value"; 
}))(); 

// shorter version 
var v = ((Func<string>)(() => "some value"))(); 
+3

son très cool ... :) – RameshVel

+0

Merci beaucoup! Je devrais me deviner. –

+2

Acceptera votre réponse dans 8 minutes. :) –

0

Voici comment vous pourriez utiliser une telle construction pour entourer le contexte - la fermeture -

Control.Click += new Func<string, EventHandler>((x) => 
new System.EventHandler(delegate(object sender, EventArgs e) 
{ 

}))(valueForX); 
+1

Cela fait beaucoup plus que ce dont vous avez besoin. – Servy

+1

Invocation inutile et redondante d'une fonction qui n'a pas besoin d'être une fonction. On dirait que vous venez d'un arrière-plan JS; ceci est nécessaire dans JS uniquement parce que les variables sont étendues à une fonction entière dans JS. C# a une bonne portée correcte, donc ce n'est pas nécessaire. – Timwi