沒有很華麗的語言,直接拿代碼說事情把。
這段代碼,會報錯嗎? 結論:當然不會
這段代碼會報錯了。原因是為啥? 這里面的水比較深。也要提醒各位寫代碼的適合要引起注意。異常:System.InvalidCastException: Specified cast is not valid.
先來分析下為毛會報錯。 我們知道,裝箱操作,是可以把任意類型進行裝箱操作的,但是我們是不是可以拆箱成我們需要的類型呢。
var test=(long)obj; 編譯器知道obj是object類型的對象。拆箱的時候,編譯器生成一個拆箱的指令,假設這是一個拆箱的為int類型,然后將int
類型轉換為long類型的自定義指令序列。假設這是一個雙重的相同的盒子,但是不同說明等等,對於所有內置整數的轉換。這個代碼將會非常大
這個將是非常慢的。所以說,編譯器在進行拆箱的時候,只能取消選中確切的類型。...
要解決這個問題:采用Convert.ToInt64既可以解決。 這個convert.to方法為我們提供了快速精確或
緩慢松懈的選擇。
關於這個問題解決辦法也有了,但是問題的本質還是沒有理解到位,請大牛們指點。