Próbuję zrozumieć jedną rzecz w tym kodzie:W jaki sposób CLR może ominąć błąd rzucania podczas przypisywania wartości pustej do struct?
Nullable<Int32> x = 5;
Nullable<Int32> y = null;
Console.WriteLine("x: HasValue={0}, Value={1}", x.HasValue, x.Value);
Console.WriteLine("y: HasValue={0}, Value={1}", y.HasValue, y.GetValueOrDefault());
i wyjście to:
x: HasValue=True, Value=5
y: HasValue=False, Value=0
A rzeczą, że nie rozumiem, kiedy przechodzą null
do y
, wierzę w to wywołuje public static implicit operator Nullable<T>(T value)
, ale definicja tej metody inicjuje nową strukturę przekazującą value
, która jest przypisana null
, jednak metoda konstruktora nie sprawdza, czy jest ona równa zeru, czy nie, aby mogła przypisać default(T)
do value
.
Jak to się stało, że możemy przypisać tutaj null do struct i działa dobrze?
Czy możecie, chłopaki, czego tu brakuje? Nie rozumiem, jak to było po prostu ominęło null
i zwrócono wartość domyślną.
kod Nullable wewnętrzna definicja:
jakiś powód nie używasz wbudowanego 'Nullable' struct? –
Po prostu uczę się wewnętrznej struktury typów zerowalnych – Tarik
Jako sidenote: Twoja implementacja "równa się" jest zepsuty.Jeśli obie strony są niestandardowe zerowalne i oba są custom-null, zwróci false, ale powinno zwrócić true. | Nie powinno też się kompilować, ponieważ nie możesz mieć inicjalizatorów na polach instancji dla struktur. – CodesInChaos