문제

다음이 금지 된 이유는 무엇입니까?

Nullable<Nullable<int>>

반면

struct MyNullable <T>
{


}

MyNullable<Nullable<int>> 

아니다

도움이 되었습니까?

해결책

구조 제약이 실제로 의미하기 때문입니다 '무효가 아님' 구조물 임에도 불구하고 무효가되기 때문에 무효가 될 수 있습니다 (가치를 받아 들일 수 있음) Nullable<int> 외부 nullable에 대한 유효한 유형 매개 변수가 아닙니다.

이것은 명시 적으로 만들어졌습니다 제약 조건 문서

여기서 t : 구조
유형 인수는 값 유형이어야합니다. Nullable을 제외한 모든 값 유형을 지정할 수 있습니다.
자세한 내용은 Nullable 유형 (C# 프로그래밍 안내서) 사용을 참조하십시오.

이론적 근거를 원한다면 내가 찾을 수없는 실제 언어 디자이너의 의견이 필요합니다. 그러나 나는 그것을 가정 할 것이다 :

  1. 현재 형태로 무효가 될 수없는 컴파일러 및 플랫폼 변경은 상당히 광범위합니다 (2.0 릴리스에 비교적 마지막 순간이 추가되었습니다).
  2. 그들은 잠재적으로 혼란스러운 가장자리 케이스를 가지고 있습니다.

int와 동등한 것을 허용합니까 ?? 언어가 귀중한 것을 구별 할 수있는 방법을 제공하지 않기 때문에 혼란스럽게 할 것입니다.<Nullable<null>> 그리고 무효<null> 다음에 대한 명백한 해결책도 아닙니다.

Nullable<Nullable<int>> x = null;
Nullable<int> y = null;
Console.WriteLine(x == null); // true
Console.WriteLine(y == null); // true
Console.WriteLine(x == y); // false or a compile time error!

그 반환을 사실로 만드는 것은 될 것입니다 매우 무효 유형과 관련된 많은 작업에 대한 복잡하고 중요한 오버 헤드.

CLR의 일부 유형은 '특별'이며, 예제는 컴파일러와 런타임이 서로가 사용하는 구현에 대해 많은 것을 알고 있다는 점에서 문자열과 프리미티브입니다. Nullable도 이런 식으로 특별합니다. 다른 지역에서는 이미 특별한 케이스이므로 특별한 케이스 where T : struct 측면은 그렇게 큰 문제가 아닙니다. 이것의 이점은 일반 클래스에서 스트러크를 다루는 데있어서 무효가없는 것과는 별도로 널과 비교할 수 없기 때문입니다. 이것은 JIT가 안전하게 고려할 수 있음을 의미합니다 t == null 항상 거짓입니다.

언어가 두 가지 매우 다른 개념이 상호 작용하도록 설계된 경우, 당신이 당신이 당신을 상호 작용할 수 있도록하는 경향이 있습니다. 예를 들어, Nullable과 평등 연산자를 고려하십시오

int? x = null;
int? y = null;
Console.WriteLine(x == y); // true
Console.WriteLine(x >= y); // false!     

구조물 일반적인 제약 조건을 사용할 때 널 막을 방지함으로써 많은 불쾌한 (그리고 불분명 한) 가장자리 케이스를 피할 수 있습니다.

이것을 의무화하는 사양의 정확한 부분에 관해서 섹션 25.7에서 (강조 광산) :

값 유형 제한 조건은 유형 매개 변수에 사용되는 유형 인수가 값 유형 (§25.7.1)이어야 함을 지정합니다. 값 유형 제한 조건을 갖는 모든 불가능한 구조물 유형, 열거 유형 또는 유형 매개 변수는이 제약 조건을 충족시킵니다. 값 유형 제한 조건을 갖는 유형 매개 변수에도 생성자-제약이 없어야한다. System.Nullable 유형은 T에 대한 nullable 값 유형 구속 조건을 지정합니다. 따라서, 형태의 형태 T의 재귀 적으로 구성된 유형 ?? 그리고 무효<무효<>> 금지됩니다.

다른 팁

나는 당신이 불가능한 가치 유형 만 사용할 수 있다고 생각합니다. Nullable에스. 부터 Nullable 그 자체가 무효가되며, 이런 식으로 둥지는 금지됩니다.

에서 http://msdn.microsoft.com/en-us/library/kwxxazwb.aspx

public Nullable(
    T value
)

유형 : TA 값 유형.

Nullable은 CLR에 내장 된 Nullable 유형의 권투 및 Unboxing에 대한 명백한 지원이 있기 때문에 특별합니다.

MSIL을 사용하는 경우 box A에 대한 지시 Nullable<T>, 당신은 실제로 얻을 것입니다 null 결과로서. 상자에있을 때 널을 생성하는 다른 값 유형은 없습니다.

Unboxing에 대한 유사하고 대칭적인 지원이 있습니다.

Nullable의 일반 유형 매개 변수 자체는 널리킹 불가능한 유형 (즉 값 유형)이어야합니다. 이것은 내가 얻는 C# 컴파일러 경고이며 말이되는 것 같습니다. 어쨌든 왜 그런 일을하고 싶니? 나는 개인적으로 그러한 선언에 대한 용도가 거의없고 의미가 거의 없습니다.

Nullable을 사용하면 값이 존재하는지 아닌지 (NULL)라는 의미에서 값 유형을 취하고 참조 유형처럼 만들 수 있습니다. 참조 유형은 이미 무효가 될 수 있으므로 허용되지 않습니다.

인용 MSDN:

무효 (t) 구조는 기준 유형이 설계에 의해 무효가 될 수 있기 때문에 값 유형 만 무효 유형으로 사용하는 것을 지원합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top