2010-10-13 2 views
19

Sono interessato se è possibile utilizzare C# per scrivere un codice analogo a questo Javascript uno:Come chiamare la funzione anonima in C#?

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

Il massimo che potevo raggiungere è:

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

var v = vf(); 

Ma volevo qualcosa di simile:

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

C'è un modo per chiamare la funzione lasciandola anonima?

+1

Puoi dire esattamente cosa vuoi fare con il codice? Qual è l'input e l'output desiderati? –

+5

@Ahmad: la domanda è completamente chiara e non ambigua. – Timwi

+0

Puoi spiegare perché vuoi farlo? Perché passare attraverso tutte le rigarole di definire una funzione anonima e invocarla quando si potrebbe semplicemente posizionare il corpo della funzione anonima * proprio lì * e sarebbe invocato quando il codice viene eseguito? –

risposta

30

Sì, ma C# è tipizzato staticamente, quindi è necessario specificare un tipo di delegato.

Per esempio, utilizzando la sintassi del costruttore:

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

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

... o la sintassi cast, che può ottenere disordinato con troppe parentesi :)

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

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

è molto bello ... :) – RameshVel

+0

Grazie mille! Dovrei immaginarmi. –

+2

Accetterà la tua risposta tra 8 minuti. :) –

0

Ecco come si potrebbe quindi utilizzare un tale costrutto per racchiudere il contesto - chiusura -

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

}))(valueForX); 
+1

Questo sta facendo molto più del necessario. – Servy

+1

Invocazione ridondante e sprecata di una funzione che non ha bisogno di essere una funzione. Sembra che tu venga da uno sfondo JS; questo è necessario in JS solo perché le variabili hanno un ambito per un'intera funzione in JS. C# ha uno scope corretto, quindi non è necessario. – Timwi