2012-08-02 32 views
0

我陌生​​感跑:怪施放對象的行爲,升C

var k = (decimal?)(int?)1; //valid cast 
var p = (decimal?)(int?)(object)(int?)1; //valid cast 
var l = (decimal?)(object)(int?)1; //Specified cast is not valid 

有人可以解釋爲什麼出現這種情況?

+0

'(decimal?)(object)1' - 指定的轉換無效 – Oded 2012-08-02 12:42:20

回答

2

第一投是:

  • 轉換intint?
  • 轉換int?decimal?

轉換都有效。

第二種情況是:

  • 轉換intint?
  • 盒的int?
  • 拆箱(作爲盒裝int這最終)的對象int?
  • 轉換int?decimal?

所有這些轉換都是有效的。

第三種情況是:

  • 轉換intint?
  • 盒的int?
  • 拆箱(其作爲套裝int結束)的對象decimal?

最後此處的轉換無效 - 您只能將相同的值類型或其可爲空的等價物取消裝箱。 (實際上CLR比這更寬容一些,但在這種情況下這沒什麼關係。)

在每種情況下轉換爲int?實際上是不相關的。對可空類型的拆箱也有點不相關,因爲對可空類型進行拆箱就像將其拆箱爲不可空類型,除了將空引用拆箱爲空值。鑑於這裏沒有空值,您的最​​終示例等同於:

object o = 1; // Boxing 
decimal d = (decimal) o; // Unboxing, but to the wrong type