2013-07-16 15 views
5

Próbuje dojść do sedna małej tajemnicy.Warunkowe oświadczenie daje różne wyniki, a następnie If

Mam następujący if:

Dim myVal As Nullable(Of Guid) 
myVal = If(vendor.Address.ID = Guid.Empty, Nothing, vendor.Address.ID) 

Wartość koniec myVal o to, w niewytłumaczalny sposób, Guid.Empty.

Jeśli piszę ten sam kod w następujący sposób:

Dim myVal As Nullable(Of Guid) 
If(vendor.Address.ID = Guid.Empty) Then 
    myVal = Nothing 
Else 
    myVal = vendor.Address.ID 
End If 

skąd ta różnica?

+0

Spróbuj tego: 'if (vendor.Address.ID.Equals (Guid.Empty), nic, vendor.Address.ID) ' – asawyer

+0

@Blam Czy możesz wyjaśnić, co masz na myśli? – asawyer

+0

@Blam: Czy możesz wyjaśnić, co masz na myśli. Myślałem, że robię 2, czy to nie jest sposób w jaki Vals działa w VB? –

Odpowiedz

3

Problem polega na tym, w jaki sposób VB.NET podaje typy korzystające z operatora If. Oba operandy muszą być tego samego typu. Biorąc pod uwagę Nothing z jednej strony i Guid z drugiej strony, zakłada się, że typem wyniku powinno być Guid, więc wymusza to Nothing na Guid.Empty. Umieszczenie wyraźnej obsady na Nullable(Of Guid) po obu stronach wystarcza, aby kompilator powiedział, że tego właśnie chcesz.

To powinno dać oczekiwane rezultaty:

Dim myVal2 As Nullable(Of Guid) 
myVal2 = If(vendor.Address.ID = Guid.Empty, CType(Nothing, Nullable(Of Guid)), vendor.Address.ID) 

Albo to:

Dim myVal2 As Nullable(Of Guid) 
myVal2 = If(vendor.Address.ID = Guid.Empty, Nothing, CType(vendor.Address.ID, Nullable(Of Guid))) 
+0

To naprawdę interesujące. Nawet 'Option Strict' nie ostrzega cię o takim zachowaniu. – asawyer

+0

C# spowoduje błąd kompilatora na 'input == Guid.Empty? null: input'. VB.Net jest ewidentnie bardziej "wybaczający". –

+0

@asawyer Myśląc o tym nieco więcej, przypuszczam, że to dlatego, że VB.Net uważa 'Nic' za mniej więcej równoważne wartości domyślnej w pewnym kontekście. Na przykład. 'Dim foo Jako Guid = Nothing' jest w porządku nawet w' Option Strict' i kompiluje do 'ldloca.s 00; initobj System.Guid'. –

Powiązane problemy