2012-12-10 27 views
15

Powiel możliwe:
Nullable type as a generic parameter possible?Dlaczego Nullable <T> nie pasuje jako rodzaj odniesienia do ogólnych ograniczeń

natknąłem się bardzo dziwne rzeczy z ograniczeniami typu rodzajowego. Mam klasy tak:

public SomeClass<T> where T:class 
{ 
} 

Jednak znalazłem Nie mogę używać zerowalne typów jak ja się spodziewać:

new SomeClass<int?>(); 

pojawia się błąd, że int? musi być odniesienie rodzaj. Czy Nullable jest po prostu strukturą z syntaktycznym cukrem, aby wyglądał jak typ referencyjny?

+2

Jaki jest powód tego ograniczenia? Czy możesz podać więcej kontekstu? FYI Nullable jest zadeklarowane jako: 'public struct Nullable gdzie T: struct' –

+0

@SimonWhitehead w zasadzie dlatego, że używanie typów wartości w tej klasie może mieć nieoczekiwane zachowanie i duży wpływ na wydajność – Earlz

+1

Wtedy myślę, że odpowiedź w górę jest" tak, Nullable jest struct ". Nie jestem całkiem pewien, co uważasz za cukier syntaktyczny dla Nullable. Wygląda na to, że jedyną opcją jest rolka własna. –

Odpowiedz

20

Nullable<T> jest struct (patrz MSDN) jednak jest to jedyna struct że nie spełnia struct ograniczenie. Dlatego nie można używać parametru Nullable jako parametru ogólnego, gdy używane są ograniczenia więzów class lub lub .

Nullable<T> to nie tylko struktura z cukrem syntetycznym. Ma specjalne wsparcie w CLR dla niektórych jego zachowań. Na przykład ma specjalne zachowanie bokserskie. W szczególności nullable nigdy nie jest zapakowane w pudełka. Wartość bazowa jest w ramce. Jeśli wartość nullable jest wartością pustą (HasValue ma wartość false), wówczas jest ona przekształcana na odwołanie zerowe. Ponadto operatory konwersji dla dowolnego Nullable<T> do Nullable<U> są przenoszone z konwersji z T na U. Są to funkcje, których nie można by zaimplementować w .NET 1.0/1.1.