当使用Action作为属性(而不是Field)时,调用该方法会导致错误:属性访问必须分配给属性或使用其值

本文关键字:属性 错误 访问 分配 方法 调用 Action Field | 更新日期: 2023-09-27 18:02:26

我已经将statprop()定义为动作属性Public Property StateProp() As Action
调用StateProp()方法导致错误:属性访问必须分配给属性或使用其值
当动作是字段而不是属性时,也可以这样做(参见示例代码的第一行)。同样的代码在c#中可以很好地工作,但在VB中需要它…

下面是这个问题的演示。在移除对statprop()的调用之前,它不会编译。我怎样才能使它工作?

Module Module1
Sub Main()
    Dim State As Action
    State = AddressOf DoSomething1
    State()
    State = AddressOf DoSomething2
    State()
    Console.ReadLine() 'all the above works fine.
    StateProp = AddressOf DoSomething1
    'StateProp() ' **************** uncommenting this call causes compilation error: Property access must assign To the Property Or use its value.
    Console.ReadLine()
End Sub
'trying to use this bit fails.
Dim m_checkstate As Action
Public Property StateProp() As Action
    Get
        Return m_checkstate
    End Get
    Set
        Console.WriteLine("Changing state. Do some work")
        m_checkstate = Value
    End Set
End Property
Sub DoSomething1()
    Console.WriteLine("Something1")
End Sub
Sub DoSomething2()
    Console.WriteLine("Something2")
End Sub
End Module

当使用Action作为属性(而不是Field)时,调用该方法会导致错误:属性访问必须分配给属性或使用其值

这是一个完整的答案,而不是我之前在评论部分给出的简洁的答案,那并没有真正解决你的问题。

检索属性值在功能上等同于调用与属性具有相同返回类型的Function(方法)。在这种情况下,它返回一个System.Action的实例,它是一个委托。委托具有您通常调用的Invoke方法。VB。Net允许您使用相当于delegatename.Invoke()的简写符号delegateName()。VB。Net还允许您在调用方法时省略空参数列表,我认为这导致了您在语法上的一些混淆。

例如:

Sub DoSomething()
End Sub

. .可以这样调用:

DoSomething
' or 
DoSomething()

为什么这两种调用DoSomething方法的方法之间存在差异?这是因为对于VB来说。为了理解您希望在Property-Get函数返回的Action实例上使用简写表示法,您需要使用第二种形式,即后挂起的'()'后跟第二个'()'。第一个集合结束方法调用,第二个集合告诉VB调用Invoke方法。请注意,如果方法需要参数,'()'中包含的参数列表可能不是空的。

:

DelegateReturnedFromProperty()()

等价于:

DelegateReturnedFromProperty.Invoke
' or
DelegateReturnedFromProperty().Invoke()

这是一种风格偏好,但如果代码由不完全精通VB的人审查,DelegateReturnedFromProperty()()似乎只是在要求混淆。调用委托的语法糖