2010-10-13 21 views
19

Estoy interesado si es posible usar C# para escribir un código similar a este Javascript uno:¿Cómo llamar a la función anónima en C#?

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

Lo más que pude lograr es:

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

var v = vf(); 

Pero yo quería algo como esto:

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

¿hay alguna manera de llamar a la función dejándolo en el anonimato?

+1

¿Puede decir exactamente qué quiere hacer con el código? ¿Cuál es la entrada y salida deseada? –

+5

@Ahmad: La pregunta es completamente clara e inequívoca. – Timwi

+0

¿Puedes explicar por qué quieres hacer esto? ¿Por qué pasar por todo el rigamarole de definir una función anónima e invocarla cuando simplemente podría colocar el cuerpo de la función anónima * allí * y se invocaría cuando se ejecute el código? –

Respuesta

30

Sí, pero C# tiene tipado estático, por lo que debe especificar un tipo de delegado.

Por ejemplo, usando la sintaxis constructor:

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

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

... o la sintaxis fundido, lo que puede causar problemas con demasiados paréntesis :)

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

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

es muy bueno ... :) – RameshVel

+0

¡Muchas gracias! Debería adivinarme a mí mismo. –

+2

Aceptará su respuesta en 8 minutos. :) –

0

Así es como usted podría entonces utilizar tal construcción para encerrar contexto - cierre-

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

}))(valueForX); 
+1

Esto está haciendo mucho más de lo necesario. – Servy

+1

Invocación innecesaria y redundante de una función que no necesita ser una función. Parece que proviene de un pasado JS; esto es necesario en JS solo porque las variables tienen un alcance para una función completa en JS. C# tiene un correcto alcance correcto, por lo que no es necesario. – Timwi

Cuestiones relacionadas