超越 Cast
与As
(Fruit)apple
- 如果它不是,它会引发异常as value
是否为null,看看是否成功[不会抛出异常...] 然而,我一直在阅读@EricLippert article,并且有一个关于Nullable Value Types的好样本:
short? s = (short?)123;
int? i = s as int?;
这个不会编译......
无法转换类型'短?' 'int?'通过引用转换,装箱转换,拆箱转换,换行转换或空类型转换
精细
为什么这样:
short? s = (short?)123;
int? i = (int?)s;
编译? (反对所有期望!我知道,s
不是int?
- 它应该是BANG但是它不是......)
我对这个讨论很多的主题感到很难过。
先谢谢。
答案 0 :(得分:25)
在第一个示例中,as
运算符尝试将对象s
用作int?
。由于int?
不在short?
的继承链中的任何位置,因此此操作失败。
在第二个示例中,您实际上是使用int? i
中的值创建新的short? s
。这是一个更慷慨的操作,因为它不必保留左侧的原始s
对象。
这里重点是as
不允许做任何不保留对象身份的事情。明确的演员可以。
以下是C#标准关于(int?)
表单如何工作的内容:
6.1.4隐式可空转换
对非可空值进行操作的预定义隐式转换 类型也可以与这些类型的可空形式一起使用。对于每一个 转换的预定义隐式标识和数字转换 从非可空值类型S到非可空值类型T, 存在以下隐式可空转换:
·来自S的隐式转换?到T?。
·从S到T的隐式转换?
基于底层证据的隐式可空转换的评估 从S到T的转换如下:
·如果可空转换来自S?到T?:
o如果源值为null(HasValue属性为false),则为 结果是T?类型的空值。
o否则,转换被评估为从S展开?至 S,然后是从S到T的底层转换,接着是a 包裹(§4.1.10)从T到T?。
·如果可空转换是从S到T?,则转换 被评估为从S到T的基础转换,后跟a 从T包裹到T?。
答案 1 :(得分:4)
示例:
int? i = (int?)s;
编译器是否因为强制转换而告诉编译器您知道无法推断的内容,即s
可以转换为int?
。
如果演员表不成功,您将只在运行时获得异常。
答案 2 :(得分:0)
我认为,如果as
失败,您将获得“有效”null
结果,因此误报。在第二种情况下,允许强制转换,如果失败则会引发异常。
答案 3 :(得分:0)
原因是int?只是System.Nullable<int>
的简写(System.Nullable<T>
是类型)。 short类型定义了对int的显式转换,但是System.Nullable<T>
没有任何这样的显式转换,因为T可以是任何其他值类型。