C# 값 유형 Null 비교의 예기치 않은 동작
C#에서 정수 및 DateTime과 같은 값 유형은 일반적으로 null을 허용하지 않습니다. 즉, null에 할당할 수 없습니다. 그러나 경우에 따라 C#에서는 오류를 발생시키지 않고 값 형식을 null과 비교할 수 있습니다.
연산자 오버로드 해결 및 null 허용 유형
이유 중 하나는 운영자 과부하 해결과 관련이 있습니다. C#은 연산자 오버로드를 지원하므로 개발자는 자신의 클래스에 대해 사용자 지정 연산자를 정의할 수 있습니다. 항등 연산자(==)의 경우 null 허용 값 유형에 대해 정의된 연산자가 있습니다.
다음 코드 조각을 고려하세요.
<code class="language-csharp">Int32 x = 1; if (x == null) { ... }</code>
이 코드는 C# 컴파일러가 항등 연산자의 적절한 오버로드를 찾았기 때문에 컴파일됩니다. int 지역 변수는 암시적으로 null 허용 정수(int?)로 변환 가능하며 null 리터럴도 null 허용 정수입니다. 따라서 연산자 ==는 널 입력 가능 정수 모두에 적용될 수 있습니다.
(x == null) 표현식이 항상 false로 평가되더라도 유효한 비교로 간주됩니다.
널 입력 가능 유형으로 변환
또 다른 상황은 값 유형을 null 개체 참조와 비교하려고 할 때입니다. 예:
<code class="language-csharp">object o = null; if (x == o) { ... }</code>
이 경우 int 변수 x는 object 유형으로 변환되어 null과 비교할 수 있습니다. 그러나 이 비교의 결과는 항상 거짓입니다.
Nullable 구조 및 조건식
DateTime.Now와 같은 구조의 정적 멤버는 기본적으로 비어 있을 수 있습니다. 즉, null과 비교할 수 있지만 컨텍스트를 고려해야 합니다. 귀하의 예에서 :
<code class="language-csharp">if (test.ADate == null) { ... }</code>
test.ADate 표현식은 명시적으로 null 허용으로 선언되지 않은 경우에도 구조체의 멤버이기 때문에 null을 허용합니다. 그러나 null과의 비교는 여전히 상수 표현식으로 간주되므로 항상 false로 평가됩니다.
요약하자면 C#에서는 연산자 오버로드 해결 및 자동 변환 덕분에 값 유형을 null과 비교할 수 있습니다. 그러나 값 유형을 Null에 할당할 수 없기 때문에 이러한 비교 결과는 항상 false라는 점을 이해하는 것이 중요합니다.
위 내용은 C#에서는 값 유형 비교가 항상 False로 평가됨에도 불구하고 Null을 허용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!