Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
27/06/11 19:06
Dedalux
Salve a tutti,
potreste aiutarmi a capire come mai questa espressione lambda se la scrivo così funziona

Function(o As Object)
    Message = DirectCast(o, String)
End Function


mentre se la scrivo così no

Function(o As Object) Message = DirectCast(o, String)


il codice si trova all'interno della classe Mediator che utilizzo per far dialogare due ViewModels

questa è la classe Mediator

    Public NotInheritable Class Mediator

#Region " Costruttori "

        Shared Sub New()
        End Sub

        Private Sub New()
        End Sub

#End Region

        Shared ReadOnly mInstance As New Mediator
        Public Shared ReadOnly Property Instance() As Mediator
            Get
                Return mInstance
            End Get
        End Property

        Private internalList As New MultiDictionary(Of String, Action(Of Object))

        ''' <summary>
        ''' Registra un colleague per uno specifico messaggio
        ''' </summary>
        ''' <param name="callback">Il callback da usare quando il messaggio viene ricevuto</param>
        ''' <param name="message">Il messaggio per cui registrarsi</param>
        Public Sub Register(ByVal callback As Action(Of Object), ByVal message As String)
            internalList.AddValue(message, callback)
        End Sub


        ''' <summary>
        ''' Notifica a tutti i sottoscrittori che sono registrati al messaggio specifico
        ''' </summary>
        ''' <param name="message">Il messaggio per cui notificare</param>
        ''' <param name="args">I parametri del messaggio</param>
        Public Sub NotifyColleagues(ByVal message As String, ByVal args As Object)
            If internalList.ContainsKey(message) Then
                For Each callback As Action(Of Object) In internalList(message)
                    callback(args)
                Next
            End If

        End Sub

    End Class


ho un ViewModel che notifica in questo modo

        Private _message As String
        Public Property Message As String
            Get
                Return _message
            End Get
            Set(ByVal value As String)
                _message = value
                NotifyPropertyChanged("Message")
                Mediator.Instance.NotifyColleagues("asd", _message)
            End Set
        End Property


e uno che riceve così

        Public Sub New()
            Mediator.Instance.Register(Function(o As Object)
                                           Message = DirectCast(o, String)
                                       End Function,
                                       "asd")
        End Sub

        Private _message As String
        Public Property Message() As String
            Get
                Return _message
            End Get
            Set(ByVal value As String)
                _message = value
                NotifyChanged("Message")
            End Set
        End Property


tra l'altro l'espressione funzionante me la segna con la sottolineatura in verde dicendo che non ritorna alcun valore in tutti i percorsi del codice....

:-| grazie

Ultima modifica effettuata da Dedalux 27/06/11 22:44
aaa
27/06/11 19:43
HeDo

contestualizza con il resto del programma
aaa
28/06/11 10:59
Il Totem
Direi perché la prima viene tradotta con un delegate, mentre la seconda con un'espressione lambda pura, ossia Func<Object, Object>. Mi sembra strano che usando l'espressione funzionale non ti dia errore di cast perché, pur essendo molto simili come contenuto, non è possibile convertire un delegate in una lambda o viceversa (tuttavia è possibile impacchettare un delegate in una lambda e viceversa). Infatti la signature di Register richiede esplicitamente un delegate di tipo Action(Of T).

Per quanto riguarda il warning, ti viene fuori perché usi function senza ritornare un valore al posto di sub:
Sub(o As Object)
    Message = DirectCast(o, String)
End Sub
aaa