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

Bri*_*ahy 9 .net vb.net lambda func byref

为什么这样:

Private [Function] As Func(Of Double, String) = Function(ByRef z As Double) z.ToString
Run Code Online (Sandbox Code Playgroud)

给出以下错误:

嵌套函数没有与委托String)兼容的签名.

这个:

Private [Function] As Func(Of Double, String) = Function(ByVal z As Double) z.ToString
Run Code Online (Sandbox Code Playgroud)

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

而且,我怎么能实现这样的事情呢?

Art*_*nko 11

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

你也不能使用ByRef参数声明Func(Of ...)泛型委托(在C#中为refout),无论你是否使用匿名函数.

但您可以声明委托类型,然后使用匿名函数使用它

Delegate Function ToStringDelegate(ByRef value As Double) As String

Sub Main()
    Dim Del As ToStringDelegate = Function(ByRef value As Double) value.ToString()
End Sub
Run Code Online (Sandbox Code Playgroud)

或者您可以使用隐式类型(如果启用了选项推断)

Dim Del = Function(ByRef value As Double) value.ToString()
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 6

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

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