vb.net lambda参数太多
我是VB.net的新手,目前正在为即将到来的项目中可能需要的常见结构(这没有任何意义)编写一些代码示例。我有一个以lambda表达式作为属性的类,如下所示:vb.net lambda参数太多,vb.net,lambda,Vb.net,Lambda,我是VB.net的新手,目前正在为即将到来的项目中可能需要的常见结构(这没有任何意义)编写一些代码示例。我有一个以lambda表达式作为属性的类,如下所示: Namespace SampleClasses Public Class Lambdas Public Shared ReadOnly Property AddFromZeroUpTo As Func(Of Integer, Integer) Get Retur
Namespace SampleClasses
Public Class Lambdas
Public Shared ReadOnly Property AddFromZeroUpTo As Func(Of Integer, Integer)
Get
Return Function(upTo As Integer) Enumerable.Range(0, upTo + 1).Sum()
End Get
End Property
Public Shared ReadOnly Property ShowMessageBox As Action(Of String)
Get
Return Function(text As String) MessageBox.Show(text)
End Get
End Property
End Class
End Namespace
现在,当我试着给那些羔羊们打电话时,有些线路行得通,有些不行,我真的不明白为什么
SampleClasses.Lambdas.ShowMessageBox()(SampleClasses.Lambdas.AddFromZeroUpTo(8)) 'works
SampleClasses.Lambdas.ShowMessageBox(SampleClasses.Lambdas.AddFromZeroUpTo(8)) 'wont work
SampleClasses.Lambdas.AddFromZeroUpTo(8) 'wont work
SampleClasses.Lambdas.AddFromZeroUpTo()(8) 'works
Dim msg = SampleClasses.Lambdas.ShowMessageBox
msg(SampleClasses.Lambdas.AddFromZeroUpTo(8)) 'works
我真的被这种行为难住了,也不知道为什么会这样,谢谢你的建议和解释。ShowMessageBox和AddFromZeroUpTo都是属性。它们被定义为只读,并返回某种类型的委托。
因此,您可以获取这些属性的值并调用返回的委托。
不能像传递方法一样将任何内容传递给这些属性 如果在调用中添加隐式的Invoke方法,则
' Get the delegate returned and invoke it
Lambdas.ShowMessageBox.Invoke(Lambdas.AddFromZeroUpTo(8))
' Doesn't make sense. ShowMessageBox is a read only property
'Lambdas.ShowMessageBox(Lambdas.AddFromZeroUpTo(8)) 'wont work
' Use the delegate returned from AddFromZeroUp
Lambdas.AddFromZeroUpTo.Invoke(8)
' That's the same as above with the Invoke omitted
Lambdas.AddFromZeroUpTo()(8)
' First calls the delegate returned by
' AddFromZeroUpTo and with the return value calls the delegate returned
' by ShowMessageBox
Dim msg = Lambdas.ShowMessageBox
msg(Lambdas.AddFromZeroUpTo(8))
请注意,只有在项目上关闭了Option Strict时,此代码才有效。从许多角度来看,这是一个非常不明智的举动。在VB.NET中(与C不同),属性可以有参数。因此语法是不明确的,当您使用AddFromZeroUpTo(8)时,编译器认为您试图将8传递给属性getter。您必须使用()(8)来解决歧义,现在编译器已经确信您打算将8传递给委托。好吧,把语法从窗口清理出来。