2013-07-16 2 views
5

작은 미스테리의 바닥에 가려고합니다.조건문은 다른 결과를 나타냅니다. 그렇다면

나는 문 경우 다음과 같은 한 :

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

myVal의 최종 값 여기 IS, 알수없는, Guid.Empty.

다음과 내가 같은 코드를 작성하는 경우 :

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

왜 차이가?

+0

이 시도 :

이 당신에게 당신이 기대하는 결과를 제공해야한다'(vendor.Address.ID.Equals (Guid.Empty), 건 몰라도, vendor.Address.ID)' – asawyer

+0

@Blam 무슨 뜻인지 분명히 할 수 있니? – asawyer

+0

@Blam : 당신이 의미하는 바를 명확하게 설명해 주시겠습니까? 나는 2를하고 있다고 생각했다. VB에서 Conditionals가 작동하는 방식이 아닌가? –

답변

3

VB.NET이 If 연산자를 사용하는 형식을 추론하는 방식에 문제가 있습니다. 두 피연산자는 모두 같은 유형이어야합니다. 한쪽에 Nothing이 있고 다른쪽에 Guid이 주어진 경우 결과 유형은 Guid이어야한다고 가정하면 NothingGuid.Empty으로 강제 변환합니다. 어느 쪽이든 Nullable(Of Guid)에 캐스트를 명시 적으로 넣는 것만으로도 컴파일러에게 실제로 원하는 것임을 알릴 수 있습니다.

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

또는이 :

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

정말 흥미 롭습니다. 'Option Strict'조차도이 동작에 대해 경고하지 않습니다. – asawyer

+0

C#에서'input == Guid.Empty? '에 컴파일러 오류가 발생합니다. null : 입력 '. VB.Net은 분명히 '용서'입니다. –

+0

@asawyer VB.Net은'Nothing'이 특정 컨텍스트에서 기본값과 대략 동일하다고 간주하기 때문에 조금 더 생각해 봅니다. 예 : 'Dim foo As Guid = Nothing'은'Option Strict'에서도 괜찮습니다. 그리고'ldloca.s 00; initobj System.Guid'. –

관련 문제