【发布时间】:2012-04-21 08:50:13
【问题描述】:
超越Cast和As之间的常规无聊区别
- 如果我知道 apple 是一个Fruit,那么我可以使用
(Fruit)apple- 如果它不是,它会抛出异常李> -
as value可以对照 null 检查是否成功[不会抛出异常...]
但是我一直在阅读 @EricLippert article 关于这个并且有一个关于 Nullable Value Types 的很好的示例:
short? s = (short?)123;
int? i = s as int?;
这不会编译...
无法转换类型'short?'到'int?通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换
很好。
为什么会这样:
short? s = (short?)123;
int? i = (int?)s;
是否编译? (违背所有期望!我知道s 不是int? - 它应该会爆炸,但它不是......)
这里的 Cast 检查应该比前一个例子(Bang)更致命
问起这个热门话题我感觉很糟糕。
提前致谢。
【问题讨论】:
-
您准确地描述了 Eric Lippert 所写的内容 - 演员表会编译,而
as运算符不会针对可空类型的情况。 -
@Yahia 但我们是否同意 short 不是 INT ?
-
short 不是 int 但可以强制转换/转换为 int - 这就是您要告诉编译器的内容:将此 short 设为 int。
-
或者换句话说,在第一个示例中,
s as int?,您正在尝试转换s本身。在第二个示例(int?)s中,您获取s的值 并尝试转换它。这样有意义吗? -
@RoyiNamir 尝试编译
int i = 123 as int;,错误将是“as 运算符必须与引用类型一起使用('int' 是值类型)”。另一方面,int i = (int)123;可以完美编译。