2010-04-07 9 views
10

Pozdrawiamy wszystkich. Przepraszam, jeśli to już zostało wcześniej zadane (przeszukano na próżno) lub jest naprawdę bardzo proste, ale po prostu nie mogę tego dostać. MSDN definition typu pustych, stwierdza, że ​​jest ona zdefiniowana w następujący sposób:Zamieszanie na temat Nullable <T> ograniczenia

[SerializableAttribute] 
public struct Nullable<T> 
where T : struct, new() 

Więc pytanie jest dość prosta: Jak to jest definicja możliwe? A może to tylko literówka? Każdy typ wartości ma już domyślny konstruktor. Rzeczywiście, kiedy próbuję skompilować coś takiego, kompilator rozsądnie mówi, że niedozwolone jest jednoczesne stosowanie obu wiązań, ponieważ drugi jest domyślnie zawarty w pierwszym.

Z góry dziękuję.

Odpowiedz

12

Myślę, że to po prostu błąd w dokumentacji. Jeśli spojrzysz na typ Nullable<T> w odbłyśniku lub używając polecenia "Przejdź do definicji" w VS, pokazuje tylko ograniczenie więzów .


EDIT

myślałem jeszcze o tym, i zrobiłem mały test:

var attributes = typeof(Nullable<>).GetGenericArguments()[0].GenericParameterAttributes; 
Console.WriteLine(attributes); 

Ten kod wygeneruje następujące wyniki:

NotNullableValueTypeConstraint, DefaultConstructorConstraint

Więc według refleksji The T w Nullable<T>robi mają new() ograniczenie ... co oznacza, że ​​nawet jeśli jest on nieprawidłowy w C#, to musi być ważny przez CLR.

Więc dokumentacja jest zarówno dobra i zła: to prawda, że ​​T w Nullable<T> ma „Domyślny konstruktor” ograniczenie, ale deklaracja C# to pokazuje jest złe ...

To nie jest rzeczywiście bardzo zaskakujące, ponieważ dokumentacja jest generowana z metadanych zespołu (i oczywiście z komentarzy XML). Nie musi być błąd w generatorze dokumentacji ...

3

Jeśli spojrzeć na demontażu IL, widać, że ma ograniczenie Konstruktor:

.class public sequential ansi serializable sealed beforefieldinit Nullable<valuetype (System.ValueType) .ctor T> 

Jeżeli dokumentacja jest generowana bezpośrednio z montaż metadanych, może to jest powód?

5

C# wymaga, aby typy wartości miały domyślne publiczne konstruktory, ale CLR tego nie robi.

Jeśli zdefiniowałeś typ w języku, który obsługuje definicję struktury tego typu (uważam, że pozwala na to C++/CLI), nie byłoby dwuznaczności co do tego, kiedy zostanie wywołany.

Powiązane problemy