Nullable <T>와 동일한 컴파일러 동작을 사용하는 C # 사용자 지정 제네릭 구조체

QuantumHive

System.Nullable<T>C #에서 다음 예제를보십시오 .

int x = 5;
int? y = 3;
int? result = x + y; //no compiler warning

또한 컴파일러 알아낼 수 있음을 의미한다 T이며 int따라서 운영자를 사용할 수.
또한

int x = 5;
int? y = 3;
bool result = x == y; //no compiler warning

이 경우, 의미가 x있었다 null, 표현이 될 것이다 false. 컴파일러는 신경 쓰지 않습니다.

이제 유사 Nullable<T>클래스 를 만들려고합니다 . 그것을라고 부르 자 Lookable<T>.

[Serializable]
public struct Lookable<T> where T : struct
{
    public Lookable(T value)
    {
        Value = value;
    }

    public T Value { get; }

    public override bool Equals(object other)
    {
        return other != null && Value.Equals(other);
    }

    public override int GetHashCode()
    {
        return Value.GetHashCode();
    }

    public override string ToString()
    {
        return Value.ToString();
    }

    public static implicit operator Lookable<T>(T value)
    {
        return new Lookable<T>(value);
    }

    public static explicit operator T(Lookable<T> value)
    {
        return value.Value;
    }
}

여기서 아이디어는 .NET의 소스 코드 에서 직접 나온 것 입니다. 제 경우에는 HasValue부동산을 생략하고 있습니다. 이제이 예제가 작동합니다.

int x = 6;
Lookable<int> y = x;
Lookable<int> z = 4;

컴파일러는 implicit operator올바른 이유 때문에 여기서 유형을 추론 할 수 있습니다 .
내가 이해하지 못하는 것은이 예제가 컴파일러를 불행하게 만들 것이라는 것입니다.

int x = 5;
Lookable<int> y = 3;
var result1 = x + y; //compile error
var result2 = x == y; //compile error

컴파일러가 나에게 메시지를주고 있습니다.

연산자는 ' int'및 ' Lookable<int>' 유형의 피연산자에 적용 할 수 없습니다 .

왜 안돼? 그리고 왜 가능 Nullable<T>합니까? 소스 코드 어디에서도 찾을 수 없습니다. 그것은 또한 가능 Lookable<T>할까요?

마크 그 라벨

이것에 대한 코드가 아닙니다 Nullable<T>-는 C # 컴파일러에, 특히 "해제 사업자"사양, 그리고 어떻게 그들이이 적용 구체적 으로 System.Nullable<T>. 사양 참조는 이 답변에 있습니다.

Nullable<T>자신의 유형으로 동작을 재현 할 수 없습니다 . 컴파일러와 런타임 (박싱 등) 모두에서 특수하게 처리합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

제네릭을 사용한 C # 8 nullable 참조 형식 처리의 일관성없는 동작

분류에서Dev

C 동작의 정확한 동작을 이해하기 위해 사용해야하는 컴파일러

분류에서Dev

const 정적 비 정수 데이터 초기화, 네임 스페이스 대 구조체를 사용한 컴파일러 동작

분류에서Dev

지정된 형식에 대한 연산자 오버로드가있을 때 C # 컴파일러는 제네릭 메서드에서 참조 동등성을 어떻게 결정합니까?

분류에서Dev

메소드 매개 변수로 List와 함께 Java 제네릭을 사용하는 컴파일러 오류 및 제네릭 예외 발생

분류에서Dev

제네릭을 사용하여 유형을 추론하는 Typescript 컴파일러

분류에서Dev

와일드 카드를 사용하여 제네릭 메서드의 동작을 모의하는 방법

분류에서Dev

제네릭 <? 슈퍼> 와일드 방법 참조 또는 람다 자바 1.8에서 작동하지

분류에서Dev

제네릭을 사용하는이 Java 인터페이스 정의가 컴파일러에서 허용되지 않는 이유는 무엇입니까?

분류에서Dev

제네릭 및 완료 핸들러와 함께 싱글 톤을 사용할 때 컴파일 오류

분류에서Dev

C # WebMethod-매개 변수와 동일한 사용자 지정 개체 보내기 및 받기

분류에서Dev

제네릭 형식과 함께 nullable 참조 형식을 사용하는 동안 경고 받기

분류에서Dev

Nullable <T>에서 Linq 조인이 ==와 동일하게 작동하지 않는 이유는 무엇입니까?

분류에서Dev

LightGBM에서 바이너리 목표와 동일한 동작으로 사용자 정의 로그 손실을 구현하는 방법은 무엇입니까?

분류에서Dev

인수와 동일한 클래스를 사용하여 제네릭을 사용하여 생성자를 어떻게 만들 수 있습니까?

분류에서Dev

Newtonsoft.JSON을 사용하는 C #의 제네릭 메서드에서 DeserializeObject <T> (string s)가 작동하지 않습니다.

분류에서Dev

제네릭 클래스의 호출 된 메서드와 동일한 T가있는 매개 변수로 C # 제네릭 클래스

분류에서Dev

배열을 맵 키로 사용하면 C ++ 11 컴파일러 명령에서 작동하지 않습니까?

분류에서Dev

JSON을 사용자 지정 '트리와 유사한'파일 구조로 구문 분석

분류에서Dev

여러 컴퓨터에 동일한 사용자 지정 설치

분류에서Dev

옵션, 제네릭 및 비교 가능한 함수가 컴파일러 요구 사항을 충족합니다.

분류에서Dev

컴파일러가 사용하지 않는 구조체는 제거하지만 클래스는 제거하지 않는 이유

분류에서Dev

구조체를 사용하는 파일이이 네임 스페이스를 사용하지 않도록 네임 스페이스를 사용하는 전역 구조체를 정의하는 방법은 무엇입니까? C ++

분류에서Dev

이 코드 조각이 C ++ 17에서 작동하는 반면 컴파일러는 C ++ 11을 사용할 때 불평하는 이유는 무엇입니까?

분류에서Dev

람다와 함께 참조로 전달을 사용하는 안정적인 정렬 사용자 지정 비교기는 컴파일 오류를 제공합니다.

분류에서Dev

Python 하위 프로세스를 사용할 때 Ctrl-C가 kill -2와 동일한 동작을 생성하지 않는 이유는 무엇입니까?

분류에서Dev

사용자 지정 데이터가 'x'인 div와 동일한 값이 'x'인 json 객체와 일치하는 방법은 무엇입니까?

분류에서Dev

제네릭 및 반복자를 사용한 Java 컴파일러 오류

분류에서Dev

Typescript에서 제네릭을 사용하여 동일한 인수 목록 적용

Related 관련 기사

  1. 1

    제네릭을 사용한 C # 8 nullable 참조 형식 처리의 일관성없는 동작

  2. 2

    C 동작의 정확한 동작을 이해하기 위해 사용해야하는 컴파일러

  3. 3

    const 정적 비 정수 데이터 초기화, 네임 스페이스 대 구조체를 사용한 컴파일러 동작

  4. 4

    지정된 형식에 대한 연산자 오버로드가있을 때 C # 컴파일러는 제네릭 메서드에서 참조 동등성을 어떻게 결정합니까?

  5. 5

    메소드 매개 변수로 List와 함께 Java 제네릭을 사용하는 컴파일러 오류 및 제네릭 예외 발생

  6. 6

    제네릭을 사용하여 유형을 추론하는 Typescript 컴파일러

  7. 7

    와일드 카드를 사용하여 제네릭 메서드의 동작을 모의하는 방법

  8. 8

    제네릭 <? 슈퍼> 와일드 방법 참조 또는 람다 자바 1.8에서 작동하지

  9. 9

    제네릭을 사용하는이 Java 인터페이스 정의가 컴파일러에서 허용되지 않는 이유는 무엇입니까?

  10. 10

    제네릭 및 완료 핸들러와 함께 싱글 톤을 사용할 때 컴파일 오류

  11. 11

    C # WebMethod-매개 변수와 동일한 사용자 지정 개체 보내기 및 받기

  12. 12

    제네릭 형식과 함께 nullable 참조 형식을 사용하는 동안 경고 받기

  13. 13

    Nullable <T>에서 Linq 조인이 ==와 동일하게 작동하지 않는 이유는 무엇입니까?

  14. 14

    LightGBM에서 바이너리 목표와 동일한 동작으로 사용자 정의 로그 손실을 구현하는 방법은 무엇입니까?

  15. 15

    인수와 동일한 클래스를 사용하여 제네릭을 사용하여 생성자를 어떻게 만들 수 있습니까?

  16. 16

    Newtonsoft.JSON을 사용하는 C #의 제네릭 메서드에서 DeserializeObject <T> (string s)가 작동하지 않습니다.

  17. 17

    제네릭 클래스의 호출 된 메서드와 동일한 T가있는 매개 변수로 C # 제네릭 클래스

  18. 18

    배열을 맵 키로 사용하면 C ++ 11 컴파일러 명령에서 작동하지 않습니까?

  19. 19

    JSON을 사용자 지정 '트리와 유사한'파일 구조로 구문 분석

  20. 20

    여러 컴퓨터에 동일한 사용자 지정 설치

  21. 21

    옵션, 제네릭 및 비교 가능한 함수가 컴파일러 요구 사항을 충족합니다.

  22. 22

    컴파일러가 사용하지 않는 구조체는 제거하지만 클래스는 제거하지 않는 이유

  23. 23

    구조체를 사용하는 파일이이 네임 스페이스를 사용하지 않도록 네임 스페이스를 사용하는 전역 구조체를 정의하는 방법은 무엇입니까? C ++

  24. 24

    이 코드 조각이 C ++ 17에서 작동하는 반면 컴파일러는 C ++ 11을 사용할 때 불평하는 이유는 무엇입니까?

  25. 25

    람다와 함께 참조로 전달을 사용하는 안정적인 정렬 사용자 지정 비교기는 컴파일 오류를 제공합니다.

  26. 26

    Python 하위 프로세스를 사용할 때 Ctrl-C가 kill -2와 동일한 동작을 생성하지 않는 이유는 무엇입니까?

  27. 27

    사용자 지정 데이터가 'x'인 div와 동일한 값이 'x'인 json 객체와 일치하는 방법은 무엇입니까?

  28. 28

    제네릭 및 반복자를 사용한 Java 컴파일러 오류

  29. 29

    Typescript에서 제네릭을 사용하여 동일한 인수 목록 적용

뜨겁다태그

보관