使用带有ByRef参数的lambda表达式的Func(Of Tin,Tout)会产生不兼容的签名错误

时间:2011-03-09 00:35:14

标签: .net vb.net lambda func byref

为什么这样:

Private [Function] As Func(Of Double, String) = Function(ByRef z As Double) z.ToString

给出以下错误:

  

嵌套函数没有与委托字符串兼容的签名)'。

虽然这个:

Private [Function] As Func(Of Double, String) = Function(ByVal z As Double) z.ToString

不是吗? (区别是ByRef / ByVal)

此外,我怎么能实现这样的事情呢?

2 个答案:

答案 0 :(得分:11)

您收到此错误,因为委托类型功能(ByVal z As Double)As String 功能(ByRef z As Double)As String 不兼容。你需要完全匹配。

此外,您无法使用ByRef参数( ref out 在C#中)声明 Func(Of ...)泛型委托,无论你是否使用匿名功能。

但是你可以声明你委托的类型,然后使用你的匿名函数

Delegate Function ToStringDelegate(ByRef value As Double) As String

Sub Main()
    Dim Del As ToStringDelegate = Function(ByRef value As Double) value.ToString()
End Sub

或者您可以使用隐式类型(如果启用了Option Infer)

Dim Del = Function(ByRef value As Double) value.ToString()

答案 1 :(得分:6)

MSDN上,它提到以下规则适用于lambda表达式中的变量范围:

  • 在引用它的委托超出范围之前,捕获的变量不会被垃圾收集。
  • 在lambda表达式中引入的变量在外部方法中不可见。
  • lambda表达式不能直接捕获ref [ByRef in VB]或out参数来自封闭方法。
  • lambda表达式中的return语句不会导致封闭方法返回。
  • lambda表达式不能包含goto语句,break语句或continue语句,其目标位于正文之外或包含匿名函数的正文中。