2010-10-13 55 views
19

我很感兴趣,如果有可能使用C#编写类似于此Javascript一个代码:如何在C#中调用匿名函数?

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

我能做到的最多的是:

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

var v = vf(); 

但我想是这样的:

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

有什么方法可以调用该函数使其匿名吗?

+1

你能说你想要完全用代码吗?期望的输入和输出是什么? – 2010-10-13 12:59:55

+5

@Ahmad:问题是完全清楚明确的。 – Timwi 2010-10-13 13:02:59

+0

你能解释一下你为什么要这样做吗?为什么要经历所有的定义匿名函数的方法,并在你可以简单地将匿名函数的主体*放在那里时调用它,并在代码运行时调用它? – 2010-10-13 14:20:01

回答

30

是的,但C#是静态类型的,所以你需要指定一个委托类型。

例如,使用构造函数的语法:

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

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

...或投语法,这会导致混乱与过多的括号:)

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

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

其非常酷... :) – RameshVel 2010-10-13 13:02:30

+0

非常感谢你!我应该猜测自己。 – 2010-10-13 13:03:13

+2

将在8分钟内接受你的回答。 :) – 2010-10-13 13:03:54

0

这里是你如何能然后利用这样一个结构来包围上下文 - 关闭 -

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

}))(valueForX); 
+1

这样做比你需要的方式更多。 – Servy 2013-03-01 20:12:58

+1

浪费,多余的调用一个不需要是函数的函数。这听起来像你来自JS背景;这在JS中是必须的,因为变量的作用范围是JS中的整个函数。 C#有适当的正确范围,所以这不是必需的。 – Timwi 2014-04-10 13:32:13