2009-11-03 76 views
7

我試圖調試一個獲取InvalidCastException的應用程序。 失敗線是爲什麼在將double轉換爲十進制時出現InvalidCastException

decimal d = (decimal)row[denominator]; 

在調試器檢查此(參見下圖),行[分母]保存與值8.0,只要能告訴我一個兩倍。 Surly應該不會有任何問題將其轉換爲小數?

(在「行」的類型是從3. party library,而這又是從數據填充從MySQL 針對這顯然會返回一些聚集爲雙VS小數在MySQL 5.1的舊的MySQL服務器進行測試時,這個問題arised - 相同的查詢,數據庫中的數據的完全相同的副本)

Visual Studio Screenshot http://img18.imageshack.us/img18/3897/invaldicast.png

我如何能進一步調查這個任何幫助嗎?

+0

什麼是返回似乎是一個對象,其中包含一個雙不是一個直的雙。 – Lazarus 2009-11-03 12:59:57

回答

3

您可以使用:

double d1 = (double)row[denominator]; 
decimal d = (decimal) d1; 

或者,當然,這縮短到:

decimal d = (decimal) (double)(row[denominator]); 

因爲這牽涉拆箱步驟中,您需要2個步驟。

2

先試着將它鑄造成doublerow[denominator]是盒裝的,所以直接投到decimal將不起作用。

6

你需要將其轉換爲雙先作爲row[denominator]是雙盒裝作爲對象 即

decimal d = (decimal)((double)row[denominator]); 
3

一個建議:)嘗試使用Convert.ToDecimal(而不是直接鑄造。

4

我想嘗試

decimal d = Convert.ToDecimal(row[denominator]); 

decimal d = 0; 
if (!decimal.TryParse(row[denominator], out d)) 
    //do something 
2

從錯誤信息和描述來看我假定行[分母]是一個盒裝雙,所以對象的類型。拆箱只能對正確的底層數據類型完成,因爲運行時現在不會在哪裏找到實際的轉換運算符,從double到decimal(在您的情況下,它會嘗試查找將對象轉換爲decimal的運算符,但那是一個拆箱操作和基本類型不是小數所以正確的做法應該是先翻倍再以十進制轉換:。

decimal d = (decimal)(double)row[denominator]; 
0

只是做

decimal d = Convert.ToDecimal(row[denominator]); 

這樣,你不需要擔心所有的鑄造問題。

相關問題