为什么val("&")
给出IndexOutOfRangeException
(索引超出了数组的范围。)?
它不应该只返回零吗?
此是否有“修复”,因此会返回零?我已经在整个项目中散布了很多val(something)
,我不想在任何地方添加if (something<>"&") Then
....
此外,在val()
中使用时会有更多字符会产生此类错误吗?
示例代码
Dim test As Integer = Val("&")
P.S。我可以用支票if (something<>"&") Then
写一个包装“myVal”函数,但我想知道导致这个问题的原因,以便我可以得到一个可靠的解决方案。
答案 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影响的角色。