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

Roy*_*mir 29 c# clr casting .net-4.0

超越Cast和之间的常规无聊差异As

  • 如果我知道那个苹果水果,所以我可以使用(Fruit)apple-如果它是不是它抛出一个异常
  • as value 可以检查null是否成功[不会抛出异常...]

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

short? s = (short?)123;
int? i = s as int?;
Run Code Online (Sandbox Code Playgroud)

不会编译......

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

精细.

那么为什么呢:

    short? s = (short?)123;
    int? i = (int?)s;
Run Code Online (Sandbox Code Playgroud)

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

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

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

提前致谢.

sbl*_*lom 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的底层转换,接着是从T到T?的包装(§4.1.10).

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