2012-02-19 81 views
0

我正在为70-536考试而学习,现在我正在检查有关converting between types的课程,我有疑问。类型之间转换

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

此外,这是考虑缩小转换?

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

你是否将其限制为基元?还是引用(基类/子类/接口)转换?或自定义转换运算符?目前它是不明确的。 – 2012-02-19 19:41:34

+0

我希望我能回答你的问题,但直到我在课上学习没有指定任何关于在基类或子类或接口之间做出区别的任何事情 – Jorge 2012-02-19 19:44:49

回答

4

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

  • 扩大转换是其中原始类型的每一个值可以在结果类型表示的转换。
  • 缩小转换是一种转换,其中某些值的原始类型不能在结果类型中表示。

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


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

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

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

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


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

特别int/Int32float/Singlelong/Int64double到/ Double。通过这些转换,某些输入值在结果类型中只能被表示为

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

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

2

始终隐式转换它扩大转换???

不可以。请记住,您可以定义自己的隐式转换。如果你愿意,你可以让它们扩大或缩小。

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

不,同样的推理。

另外这是考虑一个缩小转换?

是的。显然有信息的损失。

+0

嗨,谢谢你的提问,所以在我阅读你的答案后,我可以总是说,如果ai进行转换,那么就会将损失信息视为缩小转换。 – Jorge 2012-02-19 19:48:50

+1

@Jorge C#设计人员在语言中包含有损隐式转换。例如'Int32'到'Single'。他们可能认为即使有损,转换也在扩大。 – CodesInChaos 2012-02-19 19:54:40

3

你可以把它周围:

  • 收缩转换将永远是明确
  • 加宽转换将是隐含的。

当然假设一个理智的实现。

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

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

相关问题