9

为什么会这样:

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)

此外,我该如何实现这样的事情?

4

2 回答 2

11

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

此外,无论您是否使用匿名函数,都不能使用 ByRef 参数(C# 中的refout )声明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

或者您可以使用隐式类型(如果选项推断已打开)

Dim Del = Function(ByRef value As Double) value.ToString()
于 2011-03-09T01:06:58.443 回答
6

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

  • 在引用它的委托超出范围之前,不会对捕获的变量进行垃圾收集。
  • 在 lambda 表达式中引入的变量在外部方法中不可见。
  • lambda 表达式不能直接从封闭方法中捕获 ref [ByRef in VB] 或 out 参数。
  • lambda 表达式中的 return 语句不会导致封闭方法返回。
  • lambda 表达式不能包含 goto 语句、break 语句或 continue 语句,其目标位于主体之外或包含的匿名函数的主体中。
于 2011-03-09T00:42:50.683 回答