c# - Activator.CreateInstance creates value of type T instead of Nullable<T> -
look @ sample code below
var genericnullabletype = typeof(nullable<>); var nullabletype = genericnullabletype.makegenerictype(typeof(bool)); var returnvalue = activator.createinstance(nullabletype, (object)false);
for reason returnvalue
variable of type bool
, not bool?
. why , how avoided?
upd: here screenshot vs
in particular case using overload of createinstance
returns object
. nullable<t>
struct
hence represented object
need boxed. yet nullable<t>
can't boxed rules of clr. instead underlying value or null
used. why raw bool
here instead of bool?
.
documentation: https://msdn.microsoft.com/en-us/library/ms228597.aspx
edit
there seems confusion around determining whether type of value nullable or not. in particular it's been pointed out following prints system.boolean
, not system.nullable``1[system.boolean]
:
var x = (bool?)true; console.writeline(x.gettype());
this code falling prey boxing. call gettype
has implicit boxing operation because it's invocation of virtual method on object
, not method on nullable<t>
:
il_0009: ldloc.0 il_000a: box valuetype [mscorlib]system.nullable`1<bool> il_000f: call instance class [mscorlib]system.type [mscorlib]system.object::gettype() il_0014: call void [mscorlib]system.console::writeline(object)
the safest way print out actual type of var
value following trick generics:
static void printtype<t>(t value) { console.writeline(typeof(t)); } printtype(x); // prints system.nullable`1[system.boolean]
Comments
Post a Comment