2017-03-06 2 views
2

나는 다음과 같은 string 목록을 가지고 :?? 널 개체에 대한 연산자

string Email = Emails[0] ?? ""; 

은 위의 코드는 예외가 발생합니다 :

그것을 어떤 값이 있는지, 또는 빈 문자열을 반환하려고

List<string> Emails = new List<string>(); 

인덱스가 범위를 벗어났습니다. 음수가 아니며 컬렉션의 크기가 보다 작아야합니다. 매개 변수 이름 : 인덱스

그러나 간단한 if 문에 ?? 연산자를 변경, 그것을 잘 작동합니다 : 여기 무엇을 놓치고

if (Emails.Count > 0) 
    Email = Emails[0]; 
else 
    Email = ""; 

? 목록이 비어 있으면 Emails[0]null이 아니어야합니까?

감사합니다. 목록이 비어

string Email = Emails.FirstOrDefault() ?? ""; 

경우, Emails[0]가 null는 아니고, 그냥 존재하지 않습니다

+4

전자 메일 [0]은 목록의 첫 번째 항목에 액세스하려고합니다. 즉, 예외가 throw됩니다. – Fabio

+2

여기의 두 코드는 동일하지 않습니다.두 번째 부분에서는'Emails [0]'배열 요소에 접근하기 전에'Emails.Count> 0' 배열의 범위를 정확히 검사하고 있습니다. 첫 번째 부분에서 인덱스 0의 요소가 null 병합 연산자를 사용하여 null인지 정확히 확인하지만 배열 경계를 올바르게 검사하지는 않습니다. 예외는 예외입니다. –

+1

목록이 null이 아니므로'?? '을 사용하는 것이 중요하지 않습니다. 첫 번째 항목이 null이 아니거나 첫 번째 항목이 없습니다. 'FirstOrDefault' 나 2가 명시 적 체크를 사용하면됩니다. 첫 번째 항목에 신경 쓰면 'Queue <>'와 같은 더 적절한 컨테이너로 전환하는 것이 더 좋지 않을까요? –

답변

10

나는로 변경하는 것이 좋습니다.

편집 : 당신이 값 형식이있는 경우 예를 들어, 인터넷 용, 문자열과 심판 유형의 작동, 당신은 기본 (int)를 얻을 것이다 빈 콜렉션의 FirstOrDefault의 결과로 0입니다

+0

'FirstOrDefault'는'Emails'에 존재하지 않습니다. –

+3

@Koby'using System.Linq;'네임 스페이스에있는'Enumerable'의 확장 메소드입니다. –

+1

@Maksim 답변으로 마크를 빨리 떼어주세요! 대답의 품질을 높이려면 OP가 제공 한 두 가지 코드와 문제가 발생한 위치에 대한 설명을 제공 한 다음 솔루션이 어떻게 도움을 주 었는지 설명하십시오. 이것은이 질문의 미래 독자들에게 가치를 더할 것입니다. –

3

Emails[0] 목록의 첫 번째 항목에 액세스하려고합니다. 그래서 예외가 발생합니다.

컬렉션 문제 즉

string Email = Emails.DefaultIfEmpty("").First(); 
0
string Email = Emails[0] 

비어있는 경우 당신은 "기본"값을 선언에 대한 "읽기"DefaultIfEmpty 방법을 사용할 수 있습니다. ??은 왼쪽에있는 whats가 null인지 확인한 다음 그에 따라 작동합니다.

빈 목록의 색인이 0 일 때 null이라는 오해가있는 것 같습니다. 그것이 가장 확실한 경우는 아닙니다. 이 두 목록은 의미 상 매우 다릅니다.

var emptyList = new List<string>(); 
var someList = new List<string>() { null }; 

코드에서 빈 목록의 0 위치에있는 항목에 액세스하려고합니다. 해당 항목이 없기 때문에 범위를 벗어나는 인덱스입니다. ?? 연산자가 평가되기 전에 예외가 throw됩니다.

0

존재하지 않는 요소 0에 액세스 할 때 전자 메일을 사용하면 [0] 예외가 발생합니다.Maksim은 Emails.FirstOrDefault()가 목록이 비어 있으면 null을 반환 할 것이라고 제안 했으므로 ?? 병합 연산자