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

时间:2012-04-08 18:51:56

标签: c# .net-4.0 casting clr

超越 CastAs

之间的常规无聊差异
  • 如果我知道 apple Fruit ,那么我可以使用(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但是它不是......)

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

我对这个讨论很多的主题感到很难过。

先谢谢。

4 个答案:

答案 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可以是任何其他值类型。