2015-07-13 31 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的調用委託的語法糖。

相關問題