2012-02-19 80 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

你可以把它周圍:

  • 收縮轉換將永遠是明確
  • 加寬轉換將是隱含的。

當然假設一個理智的實現。

什麼可能會幫助你更多:隱式轉換應始終是「安全」的,因爲它不會拋出異常。明確的例外可能會抗議。

您可以依靠此來進行內置轉換。對於自定義轉換,這些只是指導原則,可以打破。

相關問題