【问题标题】:Write a lambda or anonymous function that accepts an out parameter [duplicate]编写一个接受输出参数的 lambda 或匿名函数
【发布时间】:2010-01-02 04:02:53
【问题描述】:

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

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; }

有没有办法做到这一点?

【问题讨论】:

  • 意识到这有点老了,但我不认为它是重复的。链接的问题是关于在匿名函数中使用 parent(?) 函数的 out 参数,而这个问题是关于声明一个具有自己的 out 参数的匿名函数。

标签: c# .net c#-3.0 lambda


【解决方案1】:

您可以使用 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; }

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

编辑:我在 VS2010 β2 中进行了快速检查,看起来您仍然必须定义参数类型 - 它们不是针对 C# 4 推断的。

【讨论】:

  • 我不会认为它既不是错误也不是疏忽。我认为你应该明确地说它是一个 out 或 ref 参数。为什么你不能只写(out dt) => ... 是另一回事。
  • 这实际上是我所指的 - 在 C# 中明确标记 args 为 out/ref 是预期的。必须为 lambdas 声明参数的类型不太常见,因为在大多数情况下,编译器在推断类型方面做得很好。我将更新我的帖子以使其更清晰。
  • 偶然发现了这一点 - 请注意,如果您有多个参数,则必须显式声明它们的所有类型,即使它们不是全部 ref/out
猜你喜欢
  • 1970-01-01
  • 2018-07-04
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 2014-07-27
  • 2021-12-04
相关资源
最近更新 更多