Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vb.net lambda参数太多_Vb.net_Lambda - Fatal编程技术网

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

我是VB.net的新手,目前正在为即将到来的项目中可能需要的常见结构(这没有任何意义)编写一些代码示例。我有一个以lambda表达式作为属性的类,如下所示:

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传递给委托。好吧,把语法从窗口清理出来。