Ну после downvotes (типа «booo просто прочитал документацию -1») и догадки по комментариям, я понял, что мне нужно dig за хороший ответ.
Это реализация 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)
Chec K HexOrOctValue .net Реализация: http://referencesource.microsoft.com/#Microsoft.VisualBasic/Conversion.vb,41d686eb6be390d9
Второй параметр (который передается как i+1
от 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(" & ")
НЕ приведет к ошибке (проверено).
A fix? Это зависит от вашего вкуса. Я думаю, что менее навязчивый способ является оболочкой, которая просто добавляет дополнительный символ, чтобы убедиться, что всегда есть i+1
индекса:
Public Function myVal(ByVal InputStr As String) As Double
Return Val(InputStr + " ")
End Function
Ну, это способ «ошибка» несколько получает скрытую под ковром, который не является абсолютно строго определяемая «лучшая» практика, но она достаточно крошечная, чтобы одобрять и держать дела.
p.s. «&» - единственный персонаж, затронутый этой ошибкой.
Прочитайте документацию для 'Val()'. –
@ Dan-o я сделал https://msdn.microsoft.com/en-us/library/k7beh1x9%28v=vs.90%29.aspx, и я все еще не могу получить ответ. я могу только предположить, что это путает его разбор с помощью оснований или чего-то другого, но это только предположение. заботиться о том, чтобы объяснить или помочь, мудрый downvoters? – Sharky
@ Шакки: ты понял. Если строка начинается с &, тогда функция Val() ожидает, что следующий символ будет O или H .. и поскольку в позиции 1 нет символа ... IndexOutOfRange. –