2009-05-28 1 views
4

정수의 ID와 정수의 ID를 비교하기위한 코드를 작성하고 있습니까? 내가 컴파일러 오류 얻을 코드를 컴파일 할 때정수와 정수 비교? 부울 결과? 부울 없음

Dim id As Integer = 1 
Dim nullId As Integer? = Nothing 
Dim areEqual As Boolean 
areEqual = nullId = id 

는 : 예를 들어 제가이 문제를 해결하는 것이 매우 간단 동안

Option Strict On disallows implicit conversions from 'Boolean?' to 'Boolean'. 

을, 나는 누군가가 할 수있을 것으로 기대했다 이 경고를하기 위해 컴파일러에 어떤 일이 일어나는지 설명하십시오.

답변

7

nullable 유형의 단점 중 하나입니다. NULL (일반적으로)은 "알지 못함"을 의미합니다. 과 비교하면 을 알 수 없습니다.을 알 수 없으므로입니다 (두 사람이 같은지 모르기 때문에).

.NET에서 null 입력 가능 유형과 동일합니다. 당신이 "모른다"True, False을 얻거나 수 있기 때문에하는 Boolean?Integer 결과와 함께 Integer? 비교.

+0

FileNotFound는 어떻습니까? ;-) –

+0

참조를 놓친 사람 : http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx –

3

이것은 컴파일러가 null 입력 가능 유형에 대한 연산자를 생성하는 방식의 불행한 결과입니다. 다음 코드를 사용하여 해결할 수 있습니다

Dim AreEqual As Boolean = If(nullId, 0) = id 

If 여기에 C#의 null coalesce operator에 해당하고 바로 가기입니다 :

Dim AreEqual As Boolean = If(nullId.HasValue, nullId.Value, 0) = id 
0

당신은에 유형 (정수)를 비교하기 위해 노력하고있다 nullable 유형 (정수?).

nullID의 실제 값을 확인해야하지만 null인지 null인지 확인해야합니다.

0

Option Strict On이 암시 적 변환을 '부울'에서 허용하지 않기 때문에 컴파일러 오류가 발생합니다. ~ '부울'. 그리고 당신은 '부울?' ('Integer?'= 'Integer'의 결과)를 '부울'로 변환합니다.

의도하지 않은 실수를 방지하기 위해 언어 표준에서는 일반적으로 암시 적 변환을 사용할 수 없습니다. 명시 적 변환을 추가하는 것은 쉽습니다. 코드를 암기 적으로 변환하는 것이 어렵다는 것을 알지 못하면서 암묵적인 변환을 찾는다.

null 가능 유형과 일반 유형이 서로 암시 적으로 변환되지 않도록 충분히 다릅니다.

+1

나는 질문의 고기를 놓쳤다 고 생각합니다. 코드는 정수와 정수를 처리합니까?,보고 된 오류는 부울을위한 것입니까? –

+0

"정수 = 정수입니까?" 결과는 "부울?"이고 사용자는이를 "부울"에 할당하려고합니다. 하지만 네, 처음에는 그 세부 사항을 놓쳤습니다 :) –

0

널이 값을 갖는 피연산자 중 하나가 널 (null)에 널 (null) 결과 어떤 작업을하고 정의에 의해 "나는 값이 무엇인지 모른다." 예 : 2 = null의 경우 결과는 int = int가 되는가? 가능한 값으로 null을 가져야하며 값은 true와 false가 아닙니다. 부울? 그 값의 집합을 가지기 때문에 그 연산의 반환 형식 인 형식입니다.

허용되는 암시 적 캐스트는 항상 작동하는 캐스트입니다. 암시 적으로 int를 long으로 캐스팅 할 수 있습니다. 후자가 정보를 잃을 수 있기 때문에 int에 길지는 않습니다 (명시 적으로 할 수 있습니다). 수치가 int.MaxValue보다 큰 경우 이 경우 런타임 예외로 이어질 Null 값을 unbox하려고합니다.