首页 新闻 会员 周边 捐助

C#中结构体Nullable<T>为什么可以为Null

0
悬赏园豆:5 [待解决问题]

C#中Struct是值类型,而值类型不能为null,然而Nullable<T>为Struct,为什么Nullable<T>可以为null?谢谢各位大牛帮忙解答,谢谢!

aChao0621的主页 aChao0621 | 初学一级 | 园豆:199
提问于:2015-03-29 22:42
< >
分享
所有回答(5)
0

int? 为什么可以为空。。。。

羽商宫 | 园豆:2490 (老鸟四级) | 2015-03-30 09:49

在C#中的可空类型,在IL中可以看到是通过Nullable<T>实现的,所以int?为什么可以为空,归咎于为什么Struct Nullable<T>可以为空,理解错误的地方,请多指教,谢谢!

支持(0) 反对(0) aChao0621 | 园豆:199 (初学一级) | 2015-03-30 09:55

@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应该是一个类型吧

支持(0) 反对(0) 羽商宫 | 园豆:2490 (老鸟四级) | 2015-03-30 09:58

@羽商宫: 本人愚钝,还是不太理解,但是非常感谢你给的解答!

支持(0) 反对(0) aChao0621 | 园豆:199 (初学一级) | 2015-03-30 10:08

@aChao0621: https://msdn.microsoft.com/zh-cn/library/system.nullable.aspx

支持(0) 反对(0) 羽商宫 | 园豆:2490 (老鸟四级) | 2015-03-30 10:10

@aChao0621: https://msdn.microsoft.com/zh-cn/library/b3h38hb0.aspx

支持(0) 反对(0) 羽商宫 | 园豆:2490 (老鸟四级) | 2015-03-30 10:11
0

Nullable<T> 不能为 null,通过 HasValue 属性和操作符重载,编译器通过额外的代码来判断此类型的实例是否为 null。

Launcher | 园豆:45050 (高人七级) | 2015-03-30 10:55
0

重载了逻辑等于运算符,

吴瑞祥 | 园豆:29449 (高人七级) | 2015-03-30 12:08
0

Nullable<T>是不能为null的。

你说的应该是:

Nullable<T> t = null

这个语句吧?

确实,如果自己写一个struct,这样赋值是会报告错误的。

估计是微软的编译器的问题,做了特殊处理。

519740105 | 园豆:5810 (大侠五级) | 2015-03-30 17:04
0

clr 会在装箱时将一个 HasValue 值为 false 的 Nullable<T> 结构体变成 null 引用。相反地,在将 null 拆箱成 Nullable<T> 时,会转成一个 HasValue 值为 false 的 Nullable<T> 实例。这件事是 clr 开的后门,因此 Nullable<T> 一定是在 mscorlib.dll 中定义的。其他与 null 有关的行为都是编译器干的,与 clr 无关。

shenx1ao | 园豆:206 (菜鸟二级) | 2015-04-01 10:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册