Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Espressioni lambda
Forum - C# / VB.NET - [VB.NET] Espressioni lambda

Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 21:06
Lunedì, 27/06/2011
Questo topic è stato chiuso dal moderatore

Salve a tutti,
potreste aiutarmi a capire come mai questa espressione lambda se la scrivo così funziona

Codice sorgente - presumibilmente C# / VB.NET

  1. Function(o As Object)
  2.     Message = DirectCast(o, String)
  3. End Function



mentre se la scrivo così no

Codice sorgente - presumibilmente C# / VB.NET

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

Codice sorgente - presumibilmente VB.NET

  1. Public NotInheritable Class Mediator
  2.  
  3. #Region " Costruttori "
  4.  
  5.         Shared Sub New()
  6.         End Sub
  7.  
  8.         Private Sub New()
  9.         End Sub
  10.  
  11. #End Region
  12.  
  13.         Shared ReadOnly mInstance As New Mediator
  14.         Public Shared ReadOnly Property Instance() As Mediator
  15.             Get
  16.                 Return mInstance
  17.             End Get
  18.         End Property
  19.  
  20.         Private internalList As New MultiDictionary(Of String, Action(Of Object))
  21.  
  22.         ''' <summary>
  23.         ''' Registra un colleague per uno specifico messaggio
  24.         ''' </summary>
  25.         ''' <param name="callback">Il callback da usare quando il messaggio viene ricevuto</param>
  26.         ''' <param name="message">Il messaggio per cui registrarsi</param>
  27.         Public Sub Register(ByVal callback As Action(Of Object), ByVal message As String)
  28.             internalList.AddValue(message, callback)
  29.         End Sub
  30.  
  31.  
  32.         ''' <summary>
  33.         ''' Notifica a tutti i sottoscrittori che sono registrati al messaggio specifico
  34.         ''' </summary>
  35.         ''' <param name="message">Il messaggio per cui notificare</param>
  36.         ''' <param name="args">I parametri del messaggio</param>
  37.         Public Sub NotifyColleagues(ByVal message As String, ByVal args As Object)
  38.             If internalList.ContainsKey(message) Then
  39.                 For Each callback As Action(Of Object) In internalList(message)
  40.                     callback(args)
  41.                 Next
  42.             End If
  43.  
  44.         End Sub
  45.  
  46.     End Class



ho un ViewModel che notifica in questo modo

Codice sorgente - presumibilmente VB.NET

  1. Private _message As String
  2.         Public Property Message As String
  3.             Get
  4.                 Return _message
  5.             End Get
  6.             Set(ByVal value As String)
  7.                 _message = value
  8.                 NotifyPropertyChanged("Message")
  9.                 Mediator.Instance.NotifyColleagues("asd", _message)
  10.             End Set
  11.         End Property



e uno che riceve così

Codice sorgente - presumibilmente Delphi

  1. Public Sub New()
  2.             Mediator.Instance.Register(Function(o As Object)
  3.                                            Message = DirectCast(o, String)
  4.                                        End Function,
  5.                                        "asd")
  6.         End Sub
  7.  
  8.         Private _message As String
  9.         Public Property Message() As String
  10.             Get
  11.                 Return _message
  12.             End Get
  13.             Set(ByVal value As String)
  14.                 _message = value
  15.                 NotifyChanged("Message")
  16.             End Set
  17.         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 il 28/06/2011 alle 0:44
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 12:59
Martedì, 28/06/2011
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:
Codice sorgente - presumibilmente C# / VB.NET

  1. Sub(o As Object)
  2.     Message = DirectCast(o, String)
  3. End Sub


Mh, già, ho fatto una ca*ata :|grazie Totem! - Dedalux - 28/06/11 14:58
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Up
-3
Down
V
Segnala al moderatore
Postato alle 21:43
Lunedì, 27/06/2011

contestualizza con il resto del programma

edito il post principale perchè c'è bisogno di scrivere codice... (ma chi li ha inventati sti commenti?) - Dedalux - 27/06/11 21:50
PM