2011-04-18 37 views
3

這更多的是關於VB編譯器在做什麼的好奇心問題。基本上下面的代碼產生一個錯誤,VB編譯器從字符串到數字的轉換

If "String" = CInt(1) Then 

    End If 

因爲它應該。是什麼讓我好奇的是報告的錯誤是

Conversion from string "String" to type 'Double' is not valid. 

所以,我想我的問題是,爲什麼編譯器試圖轉換爲雙時,我會承擔它應該轉換爲整數。

+0

與類型轉換相比,這更多與類型提升有關。 – Blindy 2011-04-18 20:49:54

+0

似乎沒有「類型促銷」標籤。但是,是的,我認爲你是對的。 – Kratz 2011-04-18 20:56:06

回答

2

以下可以給出一些提示。

對於以下

If "String" = CInt(1) Then 

End If 

設置InnerException堆棧跟蹤顯示

at Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value, NumberFormatInfo NumberFormat) 
at Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value) 

即使你改變了語句

If "String" = CDbl(1) Then

If "String" = CDec(1) Then

它仍然顯示上面給出的innerexception stacktrace。

這意味着它必須對右側值做任何事情。這是編譯器的行爲,同時進行隱式轉換以將字符串轉換爲更加適應的數據類型,該數據類型爲double(long將會太長 - 雙關語意圖)。

這種行爲可以通過改變聲明,以證明:

If CInt("String") = CLng(1) Then 

End If 

爲此,的InnerException堆棧跟蹤顯示

at Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value, NumberFormatInfo NumberFormat) 
at Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value) 

甚至爲顯式類型轉換意味着它首先嚐試將字符串轉換爲雙(最容易),然後將其轉換爲整數。