2015-03-10 4 views
-3

Почему val("&") дает IndexOutOfRangeException (Индекс находился за пределами массива.)?vb.net почему Val ("&") создает IndexOutOfRangeException

Должен ли он просто вернуть ноль?

Есть ли «исправление» на этом , так оно будет возвращено? У меня уже есть много val(something) разбросанных вокруг всего проекта, я не хочу, чтобы добавить везде if (something<>"&") Then ....

Кроме того, есть несколько символов, которые будут производить такого рода ошибки при использовании в val()?


образец кода Dim test As Integer = Val("&")

P.S. я мог бы просто написать оболочку «myVal» с проверкой if (something<>"&") Then, но я хотел бы знать, что вызывает эту проблему, поэтому я могу иметь надежное решение.

+3

Прочитайте документацию для 'Val()'. –

+0

@ Dan-o я сделал https://msdn.microsoft.com/en-us/library/k7beh1x9%28v=vs.90%29.aspx, и я все еще не могу получить ответ. я могу только предположить, что это путает его разбор с помощью оснований или чего-то другого, но это только предположение. заботиться о том, чтобы объяснить или помочь, мудрый downvoters? – Sharky

+1

@ Шакки: ты понял. Если строка начинается с &, тогда функция Val() ожидает, что следующий символ будет O или H .. и поскольку в позиции 1 нет символа ... IndexOutOfRange. –

ответ

2

Ну после 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. «&» - единственный персонаж, затронутый этой ошибкой.

 Смежные вопросы

  • Нет связанных вопросов^_^