考虑以下::
Object box = 5;
int @int = (int)box; // int = 5
int? nullableInt = box as int?; // nullableInt = 5;
StringComparison @enum = (StringComparison)box; // enum = OrdinalIgnoreCase
StringComparison? nullableEnum = box as StringComparison?; // nullableEnum = null.
2 件事::
- 为什么我可以拆箱
StringComparison
?我想这是因为它的基础类型是Int32
但我还是觉得很奇怪。
- 为什么
nullableEnum
值为 null?
据我了解,唯一有效的拆箱是从装箱值类型到它的类型或可为空类型。如果int
可以拆箱到Enum
,那么为什么对于可为 null 的值不成立呢?同样,如果我装箱而不是 5StringComparison.OrdinalIgnoreCase
,那就是nullableInt
将为空,但是nullableEnum
不会是。
Strictly speaking I think it's a bug in implementation detail of the runtime, since the C# spec says
如果源操作数为 null,则拆箱到可为 null 类型会生成可为 null 类型的 null 值,否则会生成将对象实例拆箱为可为 null 类型的基础类型的包装结果。
也就是说,如果拆箱到 StringComparison 有效,那么拆箱到 Nullable 也应该有效。目前还不清楚是否两者都应该有效或者都应该失败。规范说
为了在运行时成功进行到给定非空值类型的拆箱转换,源操作数的值必须是对该非空值类型的装箱值的引用。
您必须确定装箱 int 是否被视为 StringComparison 类型的装箱值,因为 StringComparison 的基础类型是 int。规范还指出,如果盒子包含“不兼容的对象”,则会抛出 InvalidCastException。 int 当然与 StringComparison“兼容”,因为您可以安全地将四个字节从堆复制到 StringComparison 变量中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)