2015-07-13 35 views
1

我将StateProp()定义为动作属性Public Property StateProp() As Action
调用StateProp()方法将导致错误:属性访问必须分配给属性或使用它的值。
当Action是一个字段而不是一个属性时,做同样的工作就可以正常工作(请参阅示例代码的第一行)。 在C#中的相同代码将工作得很好,但它需要它在VB中...当使用Action作为属性(而不是字段)时,调用该方法会导致错误:属性访问必须分配给属性或使用其值

下面是对问题的演示。它将不会编译,直到对StateProp()的调用被删除。 我该如何做这项工作?

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 
+1

'StateProp.Invoke()' – TnTinMn

+0

@TnTinMn感谢。请将它作为答案发布,以便我可以将其标记为已回答。 – Guy

回答

3

这是一个完整的答案对比,而不是在一个简短我在以前真的没有解决你的问题的注释部分给了。

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

例如:

Sub DoSomething() 
End Sub 

可以通过写这个被称为:

DoSomething 
' or 
DoSomething() 

为什么调用该方法DoSomething的有关这两种方法之间的差异?这是因为对于VB.Net来说,要理解你想对从属性获取函数返回的Action实例使用简写符号,你需要使用第二个形式,后面跟着'()',后跟一秒 '()'。第一组结束方法调用,第二组告诉VB调用Invoke方法。请注意,如果该方法需要参数,则包含在'()'中的参数列表可能不会为空。

所以:

DelegateReturnedFromProperty()() 

等同于:

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

这是一个风格的偏好,但DelegateReturnedFromProperty()()只是好像是问混乱,如果代码是由有一种人,是没有检讨完全熟悉VB.Net的调用委托的语法糖。

相关问题