C#强制转换为可空类型?

除了 CastAs之间经常无聊的区别

  • 如果我知道 苹果是一种水果所以我可以使用(Fruit)apple – 如果不是它会引发exception
  • as value可以检查as value是否为null以查看是否成功[将不会抛出exception…]

不过我一直在阅读@EricLippert关于此的文章 ,并且有一个关于Nullable Value Types的很好的示例:

 short? s = (short?)123; int? i = s as int?; 

不会编译……

无法转换类型’短?’ ‘int?’ 通过引用转换,装箱转换,拆箱转换,换行转换或空类型转换

精细。

为什么这样:

  short? s = (short?)123; int? i = (int?)s; 

编译? ( 违背所有期望 !我知道 s不是int? – 它应该是BANG但它不是……)

这里的演员阵容应该比前一个例子(轰动了)更加致命

我对这个备受关注的话题感到很难过。

提前致谢。

在您的第一个示例中, as运算符尝试将对象s用作int? 。 从int? short?的inheritance链中不是任何地方short? ,此操作失败。

在你的第二个例子中,你实际上是在创建一个新的int? i int? i的价值来自short? s short? s 。 这是一个更慷慨的操作,因为它不必保留左侧的原始对象。

这里重要的一点是,不允许做任何不保留对象身份的事情。 一个明确的演员可以。

以下是C#标准关于(int?)表单如何工作的内容:

6.1.4隐式可空转换

对非可空值类型进行操作的预定义隐式转换也可以与这些类型的可空forms一起使用。 对于从非可空值类型S转换为非可空值类型T的每个预定义隐式标识和数字转换,存在以下隐式可空转换:

·来自S的隐式转换? 到T?。

·从S到T的隐式转换?

基于从S到T的基础转换的隐式可空转换的评估进行如下:

·如果可空转换来自S? 到T?:

o如果源值为null(HasValue属性为false),则结果为类型T?的空值。

o否则,转换被评估为从S展开? 到S,然后是从S到T的底层转换,接着是从T到T?的包装(§4.1.10)。

·如果可空转换是从S到T ?,则转换被评估为从S到T的基础转换,然后是从T到T?的包装。

这个例子:

 int? i = (int?)s; 

编译器是因为演员是你告诉编译器你知道它无法推断的东西,也就是说, s可以转换为int?

如果转换不成功,您将仅在运行时获得exception。

我认为这是因为如果失败你会得到一个“有效”的null结果,所以误报 。 在第二种情况下,允许强制转换,如果失败则会引发exception。

原因是int? 只是System.Nullable简写( System.Nullable是类型)。 short类型定义了对int的显式强制转换,但是System.Nullable没有任何这样的显式强制转换,因为T可以是任何其他值类型。