2009-01-09 4 views
36

나는 약간의 디버깅을하고있는 중이 야 얻을, 그래서 나는 기본적으로 수행하는 간단한 라인을 가지고있는 EventArgs 값나는 NullReferenceException이

기록 할 :

logLine = "e.Value: " + IIf(e.Value Is Nothing, "", e.Value.ToString()) 

방법 I을 IIF 함수를 이해하고, e.Value가 Nothing (null)이면 빈 문자열을 반환하고 그렇지 않으면 값의 .ToString을 반환해야합니다. 그러나 나는 NullReferenceException을 얻고있다. 이것은 나에게 이해가되지 않는다.

아이디어가 있으십니까?

답변

68

IIf은 실제 함수이므로 모든 인수가 평가됩니다. If 키워드가 VB.NET 2008에 추가되어 원하는 단락 기능을 제공합니다.

logLine = "e.Value: " + If(e.Value Is Nothing, "", e.Value.ToString()) 
+5

또한보십시오 : (가) 형태 보증이됩니다. IIf()는 그렇지 않습니다. –

+0

Date 및 Boolean과 같은 유형의 단락 회로를 사용하면서도 여전히 Null 허용 유형에 할당하는 경우에도 문제가 발생합니다. 예를 들어, 'If'를 사용하여 Nullable 부울 값으로 'Nothing'을 반환하고 싶지만 여전히 'False'를 반환합니다. 미친 것 내가 If-Else-End로 라인을 나눌 때 로직이 예상대로 작동하면. – atconway

+2

@atconway, VB에서'Nothing'은 C#에서'null'보다는'default'와 같습니다.'Boolean'이 함축 된 타입 인 컨텍스트에서 사용될 때, 그 값은'null' 대신에'False'입니다./당신이 일반적으로 생각하는 것처럼 아무것도 (http://stackoverflow.com/q/1828173/2688). 원하는 결과를 얻으려면'If '의 한면을 올바른 유형 (예 :'부울')으로 변환해야합니다. 마찬가지로 C#에서 한면을 캐스팅해야합니다 (그렇지 않은 경우 컴파일 오류가 발생합니다). – bdukes

3

VB는 Iif에서 단락 평가를 수행하지 않습니다. 귀하의 경우, e.Value.ToString()은 e.Value가 아무 것도 상관없이 평가되고 있습니다.

3

이것은 예상되는 동작입니다.

IIF은 함수이다. 따라서 함수에 대한 매개 변수는 함수에 보내기 전에 평가됩니다.

대조적으로 C#의 삼항 연산자는 삼항 연산자의 표현식이 참이면 두 번째 매개 변수의 평가를 방해하는 언어 구문입니다.