vb.net 为什么 Val("&") 会产生 IndexOutOfRangeException

vb.net why Val("&") produces IndexOutOfRangeException

为什么 val("&") 给出 IndexOutOfRangeException(索引超出数组范围。)?

不应该 return 零吗?

这个 上是否有 "fix" 所以它会 return 零 ?我已经有很多 val(something) 分散在整个项目中,我不想在任何地方添加 if (something<>"&") Then...

另外,在val()中使用会出现这种错误的字符多吗?


示例代码 Dim test As Integer = Val("&")

p.s。我可以只写一个带有检查 if (something<>"&") Then 的包装器 "myVal" 函数,但我想知道是什么导致了这个问题,所以我可以有一个可靠的修复。

在("booo just read the documentation -1" 类型)的反对票和对评论的猜测之后,我想我必须 挖掘 才能得到一个好的答案。

这是Val

的实现

http://referencesource.microsoft.com/#Microsoft.VisualBasic/Conversion.vb,6492d8e784d2ae91

问题从这里开始:

ch = InputStr.Chars(i)
If ch = "&"c Then 'We are dealing with hex or octal numbers
    Return HexOrOctValue(InputStr, i + 1)

只要第一个非 space 字符 (ch) 是 &,它就会像这样调用 HexOrOctValue HexOrOctValue(InputStr, i + 1)

检查 HexOrOctValue .net 实现: http://referencesource.microsoft.com/#Microsoft.VisualBasic/Conversion.vb,41d686eb6be390d9

第二个参数(从 Vali+1 一样传递)用于 作为 InputStr 上的字符索引。

当然,如果i最后一个字符的索引,i+1处就没有索引了。所以HexOrOctValue会在此行触发此错误 ch = InputStr.Chars(i) // i here has the Vals' i+1 value

这就是为什么 Dim test As Integer = Val(" &") 会产生索引超出范围错误...因此 Dim test As Integer = Val(" & ") 不会产生错误(已验证)。

修复?这取决于你的口味。我认为侵入性较小的方法是包装器,它只添加一个额外的字符以确保始终有一个 i+1 索引:

Public Function myVal(ByVal InputStr As String) As Double
    Return Val(InputStr + " ")
End Function

嗯,这样 "bug" 有点隐藏在地毯下,这不是绝对严格定义的 "best" 做法,但它足够小,可以批准并让事情继续下去。

p.s。 “&”是唯一受此错误影响的字符。