当使用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
这是一个完整的答案,而不是我之前在评论部分给出的简洁的答案,那并没有真正解决你的问题。
检索属性值在功能上等同于调用与属性具有相同返回类型的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()()
似乎只是在要求混淆。调用委托的语法糖