C#铸件可空类型?(C# casting to nullable type?)

2019-07-28 21:25发布

除了与常规无聊差异CastAs

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

但是我一直读@EricLippert 文章关于这一点,有关于空值类型一个很好的例子:

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

不会编译...

无法将类型“短? 到“廉政?” 通过引用转换,装箱转换,解包转换,包装转换或null类型转换

精细。

那么,为什么这样的:

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

是否编译? (! 事与愿违知道 s没有int? -它应该去BANG但它不是...)

在铸造检查这里要远远超过前者的例子(其中又以邦)更致命

我觉得不好问这个备受瞩目的主题。

提前致谢。

Answer 1:

在你的第一个例子中, as运营商试图使用对象s作为一个int? 。 由于int? 是的继承链没有在任何地方short? ,此操作失败。

在第二个例子中,你实际上是创建一个新的int? i int? i从值short? s short? s 。 这是一个更大手笔运作,因为它并没有保留原来的s在左侧的对象。

这里很重要的一点是, as是不允许做任何事情,不会保留你的对象的身份。 显式类型转换即可。

下面是C#的标准说,关于如何(int?)形式的作品:

6.1.4隐式可空转换

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

·从S的隐式转换? 到T?

·选自S的隐式转换到T?

基于从S上的基础转换如下到T进行隐式为null的转换的评价为:

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

o如果源值为空(HasValue属性为假),结果是类型T的空值?

o否则,转换被评价为选自S解包? 到S,随后从S到T中的基础转换,随后从T包装(§4.1.10)到T?

·如果可空转换是从S到T 1的转换计算过程为从S基础转换至t接着从T包装到T?



Answer 2:

这个例子:

int? i = (int?)s;

编译器是否因为投的是你,告诉你知道的东西,它不能推断编译器,也就是s可转换为int?

你只会在运行时得到的异常如果转换不成功。



Answer 3:

我认为这是事业的情况下, as发生故障,你会得到一个“有效” null的结果,所以假阳性 。 在第二种情况下,演员被允许原因失败的情况下,它会引发异常。



Answer 4:

其原因是,INT? 只是简写System.Nullable<int>System.Nullable<T>是类型)。 短类型定义显式转换为int,然而System.Nullable<T>不具有任何这样的明确的转换,因为Ť可以是任何其它类型的值。



文章来源: C# casting to nullable type?