2012-02-25 5 views
-1

직렬화 된 클래스 객체에서 값을 저장하려고 할 때 일관성이없는 null 값 참조 오류가 발생합니다. 위의 코드에서 null 값 참조 예외가 일치하지 않습니다.

if (item.current_location.city!=null) 
{ 
    var city = item.current_location.city.Select(i => i.ToString()); 
} 

는 성공적인 삽입 item 어레이 내의 모든 인덱스 NULL 값이있는 경우에도 발생한다. 하지만 어떤 경우에는 예외가 발생합니다. 다른 사례와 어떤 식 으로든 구분할 수 없다고 생각합니다. (값이 null 일 때)

+1

무엇 '도시'의 데이터 유형입니까? 사용자 정의 유형의 컬렉션? –

답변

5

item

뿐만 아니라 city,

current_location뿐만 아니라 null이 될 수뿐만 아니라 null이 될 수 있습니다. C#을은 부울 식의 소위 바로 가기 평가를 구현하기 때문에,이 코드는 작동합니다

참고 :

if (item != null && 
    item.current_location != null && 
    item.current_location.city != null) { 
    ... 
} 

편집을 도움이 될 것이다. itemnull이면 나머지 표현식은 평가되지 않습니다. item.current_locationnull 일 경우 마지막 용어는 평가되지 않습니다.


는 (I 위의 코드에서 어떤 삽입을 볼 수 없습니다.)


는 C# 6.0부터는 당신이 널 전파 연산자를 사용할 수 있습니다 (?) :

var city = item?.current_location?.city?.Select(i => i.ToString()); 
if (city != null) { 
    // use city ... 
} 
+0

네, 제 잘못이 있습니다. 감사합니다 –

+0

삽입 코드는 아무런 문제가 없습니다. 방금 내가하려고하는 것을 언급했습니다. –

0

데이터 세트를 보지 않고는 확실한 답을 줄 수는 없지만, item 객체 또는 current_location 객체에 null 값을 확인하지 않습니다. 나는 당신이 당신의 테스트를 변경하여 시작하는 것이 좋습니다 것입니다 :

if (null != item && null != item.current_location && null != item.current_location.city) 
{ 
... 
} 
+0

현재 위치에서 국가 및 국가와 같은 다른 값을 가지고 있기 때문에 사용자가 하나의 자격 증명을 지정하지 않은 경우 코드에 따라 다른 자격 증명도 삭제됩니다. –

+0

코드가 정확합니다. 그러나, 왜 당신은'null! ='으로 수표를 시작하고 있습니까? 얼마나 많은 'null'이 테스트 중인지 봅니다. 'null'은 항상'null'입니다. 값이 얼마나 많은지, 'value! = something'을 바꿀 수 있기 때문에 좀 더 직관적 인 것처럼 보입니다. –

+0

@ OlivierJacot-Descombes : http://www.mathwords.com/s/symmetric_property.htm 누군가의 대답을 복사 한 다음 비판하는 유형인지 여부와 같은 개인적인 취향입니다. –

관련 문제