【发布时间】:2013-02-23 02:39:00
【问题描述】:
在 JavaScript 中,自调用函数并不少见:
var i = (function(x) {
return x;
})(42);
// i == 42
虽然我当然不会比较这些语言,但我认为这样的结构可以翻译成 C#,提供支持的语言版本:
var i = (delegate(int x) {
return x;
})(42);
或者:
var i = ((x) => {
return x;
})(42);
甚至:
var i = (x => x)(42);
但是,每个版本都有错误:
需要方法名
是否不支持自调用匿名方法(由于明确的禁止,或类型推断的不可能性),还是我的尝试有错误?
我冒昧地猜测,因为没有可以推断类型的方法声明 (Func<T,T>),所以它无法整理出隐含的类型,我的意思是按名称调用已声明的方法,确实弄乱了语法。
勘误表
在这个问题被淹没之前:
var i = new Func<int, int>(x => x)(42);
我应该说我希望利用类型推断,但我想这可能是不可能的,因为它是过度-隐式的。
所以,稍微澄清一下这个问题;我们知道我们可以var i = new Func<int, int>(x => x)(42);,但无需创建Func 的实例或强制转换为Func,这可能吗?
用例
对于那些好奇(或关心)的人来说,用例是这样的:
var o = new {
PropertyA = () => {
// value computation
}(),
PropertyB = () => {
// value computation
}(),
};
【问题讨论】:
-
考虑一下为什么在 javascript 中需要这个结构,并将这个概念应用到 c#。
-
@asawyer 虽然我很欣赏您的评论中“教人钓鱼”的方法,但我们将不胜感激;)
-
自调用函数在javascript中究竟完成了什么?
-
@Brandon 我想,关键在于这是否是一件好事。如果您编写一个 long 匿名函数,如果您编写一个 true 命名函数,您的代码可能会更清晰。
-
@Bracketworks 那么您需要一个可以包含私有变量值、可以公开属性和其他功能的对象吗?我认为在c#中有这种类型的构造的词...
标签: c# anonymous-function anonymous-methods self-invoking-function