我正在攻读70-536考试,现在我正在查看关于converting between types
的课程,我有疑问。
总是隐式转换它是一个扩大的转换?和显式转换这是一个缩小的转换?
这也是考虑缩小转换?
System.Int32 number32 = 25548612
System.Int16 number16 = (System.Int16) number32;
答案 0 :(得分:4)
缩小转化应该是明确的,扩大转化可能隐含只是一个设计准则。可以使用用户定义的转化创建违反此指南的转化。只要类型实现了隐式转换,也可以使用显式转换。
由于Int32
的某些值无法表示为Int16
,因此这是一个缩小的转换。根据编译器选项,Int16
范围之外的值会溢出或抛出异常。
与我之前所说的相反,这个概念也适用于基类和派生类之间的转换。
您需要将类型的东西作为可能值的集合。而不是他们有哪些成员。
派生类的每个实例始终是基类变量的有效值。因此,从派生类到基类的扩展正在扩大,因而是隐含的。
基类的某些实例不是派生类的有效值(例如,它们派生自不同的子树,或者是基类本身的实例)。因此,从基类到派生类的转换正在缩小,因此是明确的。
有一些隐含的转换,只是在宽松的意义上扩大,转换是有损的。
特别是int
/ Int32
到float
/ Single
和long
/ Int64
到double
/ {{1 }}。通过这些转换,某些输入值只能在结果类型中表示为大约。
您需要将类型视为一组允许的值。然后,您会看到派生类的每个实例也是基类的允许值。因此,从派生到基类的转换正在扩大。
相反,基类的值不是派生类的合法值。
答案 1 :(得分:3)
你可以转过来:
假设当然是理智的实施。
什么可能对你有所帮助:隐式转换应始终是“安全的”,因为它不会引发异常。明确的例外可能会引发抗议。
您可以依靠此功能进行内置转换。对于自定义转换,这些只是指导原则,可以打破。
答案 2 :(得分:2)
总是隐式转换它正在扩大转换???
没有。请记住,您可以定义自己的隐式转化。如果你愿意,你可以扩大或不扩大。
显式转换它是一个缩小的转换??
不,同样的推理。
这也是考虑缩小转换?
是。显然有信息丢失。