I am trying to understand one thing in this code:
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());
And Output is:
x: HasValue=True, Value=5
y: HasValue=False, Value=0
And the thing that I don't understand when you pass null
to y
, I believe it calls public static implicit operator Nullable<T>(T value)
but the definition of this method initializes a new struct passing value
which is assigned null
however constructor method doesn't check whether it is null or not so it can assign default(T)
to value
.
How come we can even assign null to struct here and it works fine?
Can you guys what I am missing out here? I don't understand how it just bypassed null
and returned default value.
Nullable code inner definition:
http://codepaste.net/gtce6d
believe it calls public static implicit operator Nullable(T value)
No it doesn't, because T
is Int32
in this case, and null
is not an Int32
. It just leaves the y
variable default, which means for a struct that all bytes are 0
. This results in a struct that has a HasValue
that returns false
.
You can't really pass null
to a struct, but the C# compiler is converting this for you to a default initalization.
The default is assigned in the constructor called by new Nullable<T>(value);
(Line 40)
My guess is that assigning null
to a nullable calls the default constructor. That is the only possible way for hasValue
to remain false
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With