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
第二个参数(从 Val
像 i+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。 “&”是唯一受此错误影响的字符。
为什么 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
第二个参数(从 Val
像 i+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。 “&”是唯一受此错误影响的字符。