【发布时间】:2015-04-09 12:08:21
【问题描述】:
为什么即使我有Option Strict On,下面的代码也不会导致编译错误?
Dim value As Single = 12345.12345 ' No error
默认情况下,编译器将数字文字解释为Double。从Double 转换为Single 是一种缩小转换(在这种情况下,赋值实际上将值四舍五入为12345.123)。根据MSDN article,Option Strict On的作用如下:
将隐式数据类型转换限制为仅扩大转换,禁止后期绑定,并禁止导致 Object 类型的隐式类型。
根据该描述,我的示例代码应该会导致错误。事实上,即使我在字面量后显式指定类型字符,它仍然不会将其视为错误:
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 会这样工作?对我来说这似乎是一个缺陷,但也许有一些很好的解释来解释为什么它允许将Double 文字转换为Single,但在任何其他情况下都不允许。
【问题讨论】:
-
"默认情况下,数字文字被编译器解释为 Double。" 你确定这是真的吗?你有这方面的参考吗?因为我会假设它被解释为单曲,从历史上看,这就是 VB/Basic 的先前版本所做的。 (这就是为什么我在写这样的东西时附加一个“#”。)
-
好的,根据这个:msdn.microsoft.com/en-us/library/dzy06xhf.aspx你是对的......
-
很奇怪!这也可以毫无怨言地工作: Dim value As Single = Double.MaxValue 以及 Double.PositiveInfinity 等
-
这似乎是基于问题和 cmets 的编译器错误...
-
这有一个共同的答案:“因为语言规范说它是有效的”。第 11.2 节:“无论使用的是许可语义还是严格语义,都允许这些缩小转换。”
标签: .net vb.net visual-studio