Установка Nullable Integer в строку, содержащую ничего, дает 0 - PullRequest
3 голосов
/ 14 декабря 2010

Я выдернул свои волосы из-за неожиданного поведения из обнуляемых целых чисел.

  • Если я установлю Integer на Nothing, он станет Nothing, как и ожидалось.
  • Если я установлю Integer? на String, то есть Nothing, оно станет 0!

Конечно, я получаю это независимо от того, явным образом приведу String к Integer? или нет.

Я понимаю, что могу обойти это довольно легко, но я хочу знать, чтоЯ скучаю.

    Dim NullString As String = Nothing
    Dim NullableInt As Integer? = CType(NullString, Integer?) 'Expected NullableInt to be Nothing, but it's 0!
    NullableInt = Nothing 'This works, of course. NullableInt is Nothing. 

РЕДАКТИРОВАТЬ: Ранее у меня был мой код здесь, так что без явного преобразования в Integer? и все, казалось, были зациклены на этом / смущены.Было много предложений, чтобы Option Strict On уловил этот тип вещей.Тем не менее, это на самом деле из правил преобразования строки в целое число, которые предшествуют обнуляемым типам, но все же влияют на них.

Ответы [ 2 ]

6 голосов
/ 14 декабря 2010

Причина, по которой это связано с правилами преобразования VB.Net здесь. Тип String несовместим с Integer? и, следовательно, происходит преобразование. Промежуточный шаг - конвертирование String в Integer. Правила преобразования VB.Net преобразуют Nothing или пустое String в значение Integer 0. Это может быть воспроизведено без нуля

Dim local1 As String = Nothing
Dim local2 As Integer = local1 ' It's 0

Это же преобразование затем преобразует значение Integer 0 в тип Integer?, который поддерживает значение Integer.

0 голосов
/ 14 декабря 2010

ПОЧЕМУ вы пытаетесь присвоить строку целому числу ????

    Dim nullInt As Nullable(Of Integer) 'nullInt = Nothing as expected

    'the following should NOT compile and won't with Option Strict On

    nullInt = ""
    nullInt = String.Empty
...