Nullable을 증가시키지 않는 이유 예외를 던지시겠습니까?
Console.WriteLine이 왜 빈 줄을 작성하고 ( Console.WriteLine(null)
컴파일 오류가 발생 a+=1
합니까) NullReferenceException이없는 이유 (심지어 발생 해서는 안 됨 )를 설명해 주 시겠습니까?
int? a = null;
a++; // Why there is not NullReferenceException?
Console.WriteLine(a); // Empty line
당신은 들어 올린 작업자 의 효과를 관찰하고 있습니다 .
C # 5 사양의 섹션 7.3.7에서 :
리프트 연산자를 사용하면 nullable이 아닌 값 형식에서 작동하는 미리 정의 된 사용자 정의 연산자를 이러한 형식의 nullable 형식과 함께 사용할 수도 있습니다. 리프팅 연산자는 다음과 같이 특정 요구 사항을 충족하는 사전 정의 및 사용자 정의 연산자로 구성됩니다.
- 단항 연산자
+ ++ - -- ! ~
의 경우 피연산자와 결과 형식이 모두 nullable이 아닌 값 형식이면 리프트 형식의 연산자가 존재합니다. 해제 된 양식은?
피연산자 및 결과 유형에 단일 수정자를 추가하여 구성됩니다 . 리프트 연산자는 피연산자가 null이면 null 값을 생성합니다. 그렇지 않으면 리프트 된 연산자가 피연산자를 풀고 기본 연산자를 적용한 다음 결과를 래핑합니다.
따라서 기본적 a++
으로이 경우 결과는 null
( )의 표현식이며 int?
변수는 그대로 유지됩니다.
전화 할 때
Console.WriteLine(a);
그것은 boxing되고 object
있으며, null 참조로 변환되어 빈 줄로 인쇄됩니다.
Jon의 대답은 정확하지만 몇 가지 추가 메모를 추가합니다.
왜
Console.WriteLine(null)
컴파일 오류가 발생합니까?
19 개의 과부하가 Console.WriteLine
있으며 그 중 3 개는 a에 적용 할 수 있습니다 null
: a 를 취하는 것 string
, a를 취하는 것 , a char[]
를 취하는 것 object
. C #은이 세 가지 중 무엇을 의미하는지 확인할 수 없으므로 오류가 발생합니다. Console.WriteLine((object)null)
이제는 명확하기 때문에 합법적입니다.
왜
Console.WriteLine(a)
빈 줄을 쓰나요?
a
null int?
입니다. 오버로드 확인은 object
메서드 의 버전을 선택 int?
하므로은 null 참조로 박스됩니다. 따라서 이것은 기본적으로 Console.WriteLine((object)null)
빈 줄을 쓰는와 동일 합니다.
NullReferenceException
증분 이없는 이유는 무엇 입니까?
걱정 되는 널 참조 는 어디에 있습니까 ? 시작할 참조 유형이 아닌 a
null int?
입니다! nullable 값 유형은 참조 유형이 아니라 값 유형 이므로 참조 유형 에 대해 boxing되지 않는 한 참조 의미 체계를 가질 것으로 기대하지 마십시오. 추가로 권투가 없습니다.
널 증가하고 있습니까 ???
int? a = null;
a++;
이 문장은 단순히 null++
null + 1을 의미 합니다.
이 문서에 따라 nullable 형식은 기본 값 형식에 대한 올바른 값 범위와 추가 null 값을 나타낼 수 있습니다. Nullable ( "Int32의 Nullable"이라고 발음)에는 -2147483648에서 2147483647까지의 모든 값을 할당 할 수 있습니다. null 값을 할당 할 수 있습니다.
여기에서 null을 증가 시키면 0이나 다른 정수가 아닌 null 값이됩니다.
왜 오류 대신 공백으로 인쇄됩니까 ??
null 값으로 nullable 유형을 인쇄하면 변수, 즉 메모리 위치의 값을 인쇄하기 때문에 오류 대신 공백이 인쇄됩니다. null 또는 정수일 수 있습니다.
그러나 null을 사용하여 인쇄하려고 할 때 Console.WriteLine(null)
null은 변수가 아니므로 메모리 위치를 참조하지 않습니다. 따라서 오류가 발생 "NullReferenceException"
합니다.
그런 다음
Console.WriteLine(2);
??를 사용하여 정수를 어떻게 인쇄 할 수 있습니까 ?
이 경우 2는 임시 위치에서 메모리에 저장되고 포인터는 인쇄 할 해당 메모리 위치를 가리 킵니다.
참고 URL : https://stackoverflow.com/questions/29172558/why-doesnt-incrementing-nullableint-throw-an-exception
'programing tip' 카테고리의 다른 글
Java 문자열에 따옴표를 입력하는 방법은 무엇입니까? (0) | 2020.08.23 |
---|---|
HTML5에서 캔버스를 중앙에 배치하는 방법 (0) | 2020.08.23 |
ActionLink의 ID를 컨트롤러에 전달하는 ASP.NET MVC (0) | 2020.08.23 |
모듈 __file__ 속성은 절대적입니까 아니면 상대적입니까? (0) | 2020.08.22 |
InputStream에서 File 객체를 만들 수 있습니까? (0) | 2020.08.22 |