编写一个接受out参数的lambda或匿名函数

dor*_*orn 9 .net c# lambda c#-3.0

我的代码中定义了一个委托:

public bool delegate CutoffDateDelegate( out DateTime cutoffDate );
Run Code Online (Sandbox Code Playgroud)

我想创建委托并使用lambda或匿名函数初始化,但这些都没有编译.

CutoffDateDelegate del1 = dt => { dt = DateTime.Now; return true; }
CutoffDateDelegate del2 = delegate( out dt ) { dt = DateTime.Now; return true; }
Run Code Online (Sandbox Code Playgroud)

有办法做到这一点吗?

LBu*_*kin 19

您可以使用lambda或匿名委托语法 - 您只需指定参数的类型,并将其标记为out:

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; }
Run Code Online (Sandbox Code Playgroud)

虽然预期将参数明确地声明为ref/out,但是必须在lambda表达式中声明参数类型不太常见,因为编译器通常可以推断它们.但是,在这种情况下,编译器当前不会在lambda/anon表达式中推断out或ref参数的类型.我不确定这种行为是否是一个错误/疏忽,或者是否存在语言原因,为什么必须如此,但是有一个简单的解决方法.

编辑:我快速检查了VS2010β2,看起来你必须定义参数类型 - 它们不是C#4的推断.

  • 我不认为它既不是错误也不是疏忽.我认为你应该明确表示它是一个out或ref参数.为什么你不能只写`(out dt)=> ......`是另一回事. (5认同)
  • 偶然发现了这一点 - 请注意,如果您有多个参数,则必须明确声明所有类型,即使它们不是全部参考/退出 (2认同)