>백엔드 개발 >C++ >C#에서는 값 유형 비교가 항상 False로 평가됨에도 불구하고 Null을 허용하는 이유는 무엇입니까?

C#에서는 값 유형 비교가 항상 False로 평가됨에도 불구하고 Null을 허용하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-16 18:30:10901검색

Why Does C# Allow Value Type Comparisons to Null, Even Though They Always Evaluate to False?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.