2011-02-04 3 views
2

다음 문 작품 :? 운영자 VS ?? 연산자 사용법

Class.ID = odrDataReader["ID"] == null ? 0 : Convert.ToInt32(odrDataReader["ID"]); 

그러나 다음과 같은하지 않습니다 :

Class.ID = odrDataReader["ID"] as int? ?? 0; //ID is always 0 

어느 하나 이유를 설명 할 수 ?? ID 열이 null이 아니더라도 연산자가 항상 0을 반환합니까? (커크에 의해 제안)

솔루션 :

Class.ID = Convert.ToInt32(odrDataReader["ID"] ?? 0); 
+0

내가 odrDataReader는 [ "ID"]는 int 형으로 강제 할 수있는 무언가를 반환하는지 확인 낫겠 시도 할 수 있습니다. 그것이 어떤 객체 유형이라면 int로 AS'ed 될 수 없으며 what ?? 항상 null이므로 결과는 항상 0입니다. – Sean

+0

실제로는''? :'(삼항 연산자)입니다 (http://msdn.microsoft.com/en-us/library/ty67wk28%28v=VS.100). % 29.aspx) 형식이 'cond? iftrue : 그렇지 않으면'. –

+0

@pst : 사소한 nitpick, 그것은 _conditional_ 연산자라고합니다. 단지 언어에서 삼중 연산자 만 존재합니다. –

답변

5

처음에 당신은 당신이 odrDataReader["ID"] as int?을 사용하여 두 번째에 Convert.ToInt32(odrDataReader["ID"])를 사용합니다. 첫 번째 문장이 옳다는 의미에서 두 번째 문장도 사용해야합니다.

실제로 제가 처음 사용하는 것이 좋다고 생각합니다. 정말로 사용하고 싶다면 이상하게 보일 수 있습니다. ?? 운영자.

: 비트를 설명하려면 odrDataReader["ID"] as int?은 변환이 아닙니다. odrDataReader [ "ID"]가 문자열이면 항상 null을 반환합니다.

+0

그것은 단지 목적을 이길까요 ?? 운영자. –

+0

그러나 odrDataReader [ "ID"]에는 항상 숫자가 포함되어 있습니다. –

+0

그러나 어떤 유형으로? 디버거를 실행하고 어떤 유형인지 확인하십시오. 내 추측은 그 문자열. – Euphoric

0

Misread 질문. 나는 당신이 int로 odrDataReader [ "ID"]를 캐스팅했기 때문에 그것을 추측하고 있습니까? 확인하기 전에. 캐스팅을 건너 뛰려고 시도해야하는데, 그것이 실제로 문제가되는지는 의심 스럽습니다.

0

Coalescing 연산자는 C# 2.0에 새로 추가 된 연산자입니다. 병합 연산자는 ??라고도합니다.

Nullable<int> a = null; 
Nullable<int> b = 10; 
int c = a ?? b.Value; 

운영자 합체 운영자 작업 유착 단지에만 nullable 형식과 함께 작동 삼항 연산자와 유사한 어떤하지만 일부. 그래서 그것의 정렬 손을 연산자 Nullable 유형에만 처리 ​​할 수 ​​있습니다.

내 블로그 게시물을 확인하십시오 Coalescing operator - ??

+0

이것은 어떤 방식 으로든 질문에 대답합니까? –

+0

@kirk -이 제목에 따라 질문 제목 (? 연산자 VS ?? 연산자 사용법)을 읽습니다. 나는 그 오른쪽을 말합니다 –

+0

당신은 질문이 아니라 제목에 답했습니다. –

0

을 ?? 연산자는 null-coalescing operator입니다. 값이 널 (null) 인 경우 기본값을 정의합니다. Int32는 일반적으로 null 값을 사용할 수없는 .NET의 값 형식이므로 int?은 null 일 수있는 Int32를 지정합니다.

+0

이것은 어떤 방식 으로든 질문에 대답합니까? –

+0

음 ... 일종의 아니지만 완전히. 나는 그가 예상했던대로 작동하지 않는 이유 (즉, 운영자가 어떻게 작동 하는지를 알려주는)에 대한 명확한 설명을 듣고 혼란을 해결할 것이라고 생각했습니다. 나는 ** 스푼으로 대답하는 것보다 **가 더 중요한 이유를 배운다고 생각한다. –

2

모두는 ID 열의 유형에 따라 다릅니다.

이 그렇지 않은 가능성이 높습니다하고 다른 유형 그러나
Class.ID = (int?)odrDataReader["ID"] ?? 0; 

(나는 string를 추측에는 요) : 그것은 참으로 유형 int?의 인 경우에, 당신은 아무런 문제없이이 작업을 수행 할 수 있어야한다 . A string은 분명히 int?이 아니므로 odrDataReader["ID"] as int?은 항상 null을 반환하며 값은 0입니다. 호화 로움 언급대로 as 연산자는 참조/권투 전환 만 수행합니다. 이 경우 ??을 사용하는 것은 옵션이 아니므로 첫 번째 표현식을 사용해야합니다.

+0

포인트를 얻었습니다. 감사. –

1

odrDataReader["ID"] as int? - 두 문장의 차이점이므로 as 키워드를 사용하는 것은 Convert과 같지 않습니다.당신이 ??를 사용하려면

당신은

Class.ID = Convert.ToInt32(odrDataReader["ID"] ?? 0); 
+0

좋은 .. 매끄러운 솔루션 .. 고맙습니다. –

+1

'??'연산자에 대한 피연산자는 모두 호환 가능한 유형이어야합니다. 그것은'odrDataReader [ "ID"]'의 정적 유형이'int? '인 경우 작동합니다. 다른 모든 유형 ('object' 포함)은 컴파일러 오류를 생성합니다. 명시 적 캐스트가 필요합니다 (실패 할 수도 있음). –