2010-01-02 81 views
9

我在我的代码中定义一个委托一个lambda或匿名函数:写一个接受了参数

public bool delegate CutoffDateDelegate(out DateTime cutoffDate); 

我想创建委托,并与一个lambda或匿名函数初始化,但这些都不编译。

CutoffDateDelegate del1 = dt => { dt = DateTime.Now; return true; } 
CutoffDateDelegate del2 = delegate(out dt) { dt = DateTime.Now; return true; } 

有没有办法做到这一点?

+2

意识到这是一种老了,但我不要认为它是重复的。链接的问题是关于在匿名函数内使用父(?)函数的out参数,而这个是关于声明一个拥有它自己的out参数的匿名函数。 – Salvador 2015-05-17 01:17:21

回答

18

您可以使用拉姆达或匿名委托语法 - 你只需要指定参数的类型,并将其标记为出:

public delegate bool CutoffDateDelegate(out DateTime cutoffDate); 

// using lambda syntax: 
CutoffDateDelegate d1 = 
    (out DateTime dt) => { dt = DateTime.Now; return true; }; 

// using anonymous delegate syntax: 
CutoffDateDelegate d2 = 
    delegate(out DateTime dt) { dt = DateTime.Now; return true; } 

虽然明确声明参数作为参考,预计输入/输出,不得不在lambda表达式中声明参数类型,因为编译器通常可以推断它们。但是,在这种情况下,编译器当前不会推断lambda/anon表达式中out或ref参数的类型。我不确定这种行为是否是一个错误/疏忽,或者是否有语言原因,为什么必须这样做,但有一个简单的解决方法。

编辑:我没有在VS2010β2进行快速检查,它仍然看起来像你必须定义的参数类型 - 它们不是推断C#4

+4

我不认为这既不是一个错误,也不是一个疏忽。我认为你应该明确表示这是一个out或ref参数。为什么你不能只写'(out dt)=> ...'是另一回事。 – 2010-01-02 04:11:24

+1

这实际上就是我所指的 - 在C#中明确标记出参数/ ref。不得不声明lambda表达式的参数类型不太常见,因为在大多数情况下,编译器在推断类型方面做得非常出色。我会更新我的帖子,使其更清晰。 – LBushkin 2010-01-02 04:16:41

+2

只是偶然发现了这一点 - 注意如果你有多个参数,你必须明确地声明它们的所有类型,即使它们不全是ref/out – drzaus 2012-04-25 17:58:36