在类型之间转换

时间:2012-02-19 19:39:13

标签: c# implicit-conversion

我正在攻读70-536考试,现在我正在查看关于converting between types的课程,我有疑问。

总是隐式转换它是一个扩大的转换?和显式转换这是一个缩小的转换?

这也是考虑缩小转换?

System.Int32 number32 = 25548612
System.Int16 number16 = (System.Int16) number32;     

3 个答案:

答案 0 :(得分:4)

缩小转化应该是明确的,扩大转化可能隐含只是一个设计准则。可以使用用户定义的转化创建违反此指南的转化。只要类型实现了隐式转换,也可以使用显式转换。

  • 扩展转化是指原始类型每个值可以在结果类型中表示的转化。
  • 缩小转化是指原始类型的某些值无法在结果类型中表示的转化。

由于Int32的某些值无法表示为Int16,因此这是一个缩小的转换。根据编译器选项,Int16范围之外的值会溢出或抛出异常。


与我之前所说的相反,这个概念也适用于基类和派生类之间的转换。

您需要将类型的东西作为可能值的集合。而不是他们有哪些成员。

派生类的每个实例始终是基类变量的有效值。因此,从派生类到基类的扩展正在扩大,因而是隐含的。

基类的某些实例不是派生类的有效值(例如,它们派生自不同的子树,或者是基类本身的实例)。因此,从基类到派生类的转换正在缩小,因此是明确的。


有一些隐含的转换,只是在宽松的意义上扩大,转换是有损的。

特别是int / Int32float / Singlelong / Int64double / {{1 }}。通过这些转换,某些输入值只能在结果类型中表示为大约

您需要将类型视为一组允许的值。然后,您会看到派生类的每个实例也是基类的允许值。因此,从派生到基类的转换正在扩大。

相反,基类的值不是派生类的合法值。

答案 1 :(得分:3)

你可以转过来:

  • 缩小转化将始终是明确的
  • 扩大转换将是隐含的。

假设当然是理智的实施。

什么可能对你有所帮助:隐式转换应始终是“安全的”,因为它不会引发异常。明确的例外可能会引发抗议。

您可以依靠此功能进行内置转换。对于自定义转换,这些只是指导原则,可以打破。

答案 2 :(得分:2)

  

总是隐式转换它正在扩大转换???

没有。请记住,您可以定义自己的隐式转化。如果你愿意,你可以扩大或不扩大。

  

显式转换它是一个缩小的转换??

不,同样的推理。

  

这也是考虑缩小转换?

是。显然有信息丢失。