爲什麼下面的代碼不會導致編譯錯誤,即使我有Option Strict On
?爲什麼在選項嚴格的情況下允許從Double到Single分配
Dim value As Single = 12345.12345 ' No error
默認情況下,數字文字由編譯器解釋爲Double
。從Double
轉換爲Single
是一個縮小的轉換(分配,在這種情況下,實際上是將值四捨五入到12345.123
)。按照MSDN article,Option Strict On
具有以下作用:
Restricts implicit data type conversions to only widening conversions, disallows late binding, and disallows implicit typing that results in an Object type.
基於這樣的描述,我的示例代碼應導致錯誤。事實上,即使我的文字後明確指定類型的字符,它仍然不認爲這是一個錯誤:
Dim value As Single = 12345.12345R 'Still no error, despite the "R"
即使這不會導致錯誤:
Dim value As Single = CDbl(12345.12345) 'Still no error, despite the CDbl() conversion
但,這確實會導致一個錯誤,因爲我期望:
Dim value1 As Double = 12345.12345
Dim value2 As Single = value1 ' Causes "Option Strict On disallows implicit conversions from 'Double' to 'Single'" error
同樣,這也失敗了,正如預期:
Public Function GetValue() As Double
Return 12345.12345
End Function
' ...
Dim value As Single = GetValue() ' Causes "Option Strict On disallows implicit conversions from 'Double' to 'Single'" error
作爲一個側面說明,下面的失敗在C#中,符合市場預期:
float x = 12345.12345; ' Causes error in C#
因此,它並不適用於所有.NET語言的問題。它似乎是VB.NET的一個特點。
此外,VB.NET不允許這樣的隱式轉換,即使它是從文字轉換:
Dim x As Integer = 1.5 ' Causes error
所以,我的問題是,爲什麼VB.NET這種工作方式?這對我來說似乎是一個缺陷,但也許有一個很好的解釋,爲什麼它允許將文字的轉換範圍縮小到Single
,但在其他任何情況下都不會。
「*數字文字默認情況下由編譯器解釋爲Double。*」您確定這是真的?你有參考嗎?因爲我認爲它被解釋爲一個Single,就像歷史上那樣,VB/Basic的先前化身已經完成了它。 (這就是爲什麼我用附加的「#」編寫這樣的東西的原因。) – RBarryYoung 2015-02-09 17:11:55
OK,根據這個:https://msdn.microsoft.com/en-us/library/dzy06xhf.aspx你是正確的... – RBarryYoung 2015-02-09 17:14:10
非常奇怪!這也適用於沒有投訴:Dim value As Single = Double.MaxValue以及Double.PositiveInfinity等 – theduck 2015-02-09 17:55:29