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

时间:2015-03-10 11:00:10

标签: vb.net indexoutofrangeexception

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

它不应该只返回零吗?

是否有“修复”,因此会返回零?我已经在整个项目中散布了很多val(something),我不想在任何地方添加if (something<>"&") Then ....

此外,在val()中使用时会有更多字符会产生此类错误吗?


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

P.S。我可以用支票if (something<>"&") Then写一个包装“myVal”函数,但我想知道导致这个问题的原因,以便我可以得到一个可靠的解决方案。

1 个答案:

答案 0 :(得分:2)

在downvotes(类型为“booo只读文档-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)

只要第一个非空格字符ch)为&,它就会HexOrOctValue HexOrOctValue(InputStr, i + 1)调用i+1

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

第二个参数(从Val传递,如InputStr)使用作为i+1上的字符索引。

当然,如果i最后一个字符的索引,则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 索引:

{{1}}

嗯,这样一来,“虫子”有点隐藏在地毯下面,这不是绝对严格定义的“最佳”练习,但它足够小,可以批准并保持不变。

P.S。 “&安培;”是唯一受此bug影响的角色。