2009-11-20 4 views
0

J'ai posté une question similaire auparavant, qui a fonctionné en C# (grâce à la communauté), mais le vrai problème était dans VB.Net (avec l'option strict sur). Le problème est que les tests ne passent pas.passant par référence dans VB.Net

Public Interface IEntity 
    Property Id() As Integer 
End Interface 

    Public Class Container 
    Implements IEntity 
    Private _name As String 
    Private _id As Integer 
    Public Property Id() As Integer Implements IEntity.Id 
     Get 
      Return _id 
     End Get 
     Set(ByVal value As Integer) 
      _id = value 
     End Set 
    End Property 

    Public Property Name() As String 
     Get 
      Return _name 
     End Get 
     Set(ByVal value As String) 
      _name = value 
     End Set 
    End Property 
End Class 

Public Class Command 
    Public Sub ApplyCommand(ByRef entity As IEntity) 
     Dim innerEntity As New Container With {.Name = "CommandContainer", .Id = 20} 
     entity = innerEntity 
    End Sub 
End Class 

<TestFixture()> _ 
Public Class DirectCastTest 
    <Test()> _ 
    Public Sub Loosing_Value_On_DirectCast() 
     Dim entity As New Container With {.Name = "Container", .Id = 0} 
     Dim cmd As New Command 
     cmd.ApplyCommand(DirectCast(entity, IEntity)) 
     Assert.AreEqual(entity.Id, 20) 
     Assert.AreEqual(entity.Name, "CommandContainer") 
    End Sub 
End Class 
+0

Quelle est la question? – JonH

+0

désolé, la question est que les tests ne passent pas –

Répondre

4

La même chose est vraie dans VB comme dans C#. En utilisant le DirectCast, vous créez effectivement une variable locale temporaire, qui est ensuite transmise par référence. C'est une variable locale entièrement distincte de la variable locale entity.

Cela devrait fonctionner:

Public Sub Losing_Value_On_DirectCast() 
    Dim entity As New Container With {.Name = "Container", .Id = 0} 
    Dim cmd As New Command 
    Dim tmp As IEntity = entity 
    cmd.ApplyCommand(tmp) 
    entity = DirectCast(tmp, Container) 
    Assert.AreEqual(entity.Id, 20) 
    Assert.AreEqual(entity.Name, "CommandContainer") 
End Sub 

Bien sûr, il serait plus simple de rendre la fonction retourne la nouvelle entité comme sa valeur de retour ...

+0

Wow, j'ai appris quelque chose de nouveau aujourd'hui ... – Walter

Questions connexes