C#中Struct是值类型,而值类型不能为null,然而Nullable<T>为Struct,为什么Nullable<T>可以为null?谢谢各位大牛帮忙解答,谢谢!
int? 为什么可以为空。。。。
在C#中的可空类型,在IL中可以看到是通过Nullable<T>实现的,所以int?为什么可以为空,归咎于为什么Struct Nullable<T>可以为空,理解错误的地方,请多指教,谢谢!
@aChao0621:
c#代码: int? nullNum = null; int num = 42; IL代码: [5] valuetype [mscorlib]System.Nullable`1<int32> nullNum, [6] int32 num IL_0060: ldloca.s nullNum IL_0062: initobj valuetype [mscorlib]System.Nullable`1<int32> IL_0068: ldc.i4.s 42 IL_006a: stloc.s num
System.Nullable应该是一个类型吧
@羽商宫: 本人愚钝,还是不太理解,但是非常感谢你给的解答!
@aChao0621: https://msdn.microsoft.com/zh-cn/library/system.nullable.aspx
@aChao0621: https://msdn.microsoft.com/zh-cn/library/b3h38hb0.aspx
Nullable<T> 不能为 null,通过 HasValue 属性和操作符重载,编译器通过额外的代码来判断此类型的实例是否为 null。
重载了逻辑等于运算符,
Nullable<T>是不能为null的。
你说的应该是:
Nullable<T> t = null
这个语句吧?
确实,如果自己写一个struct,这样赋值是会报告错误的。
估计是微软的编译器的问题,做了特殊处理。
clr 会在装箱时将一个 HasValue 值为 false 的 Nullable<T> 结构体变成 null 引用。相反地,在将 null 拆箱成 Nullable<T> 时,会转成一个 HasValue 值为 false 的 Nullable<T> 实例。这件事是 clr 开的后门,因此 Nullable<T> 一定是在 mscorlib.dll 中定义的。其他与 null 有关的行为都是编译器干的,与 clr 无关。