Одинаковые If () и If дают разные результаты - PullRequest
3 голосов
/ 22 декабря 2010

Какая разница в двух блоках кода ниже?Я ожидал, что они вернут тот же результат, но они этого не сделают.

В случае, когда xml. @ Type = "null", я хочу, чтобы PatientMetricTypeID (целое число с нулевым значением) в итоге получило значение Nothing.

Блок № 1: If ()

В этом случае он заканчивается как 0. Похоже, ничто не рассматривается как целое число и преобразуется в 0. Я могувроде как понять, почему это может произойти, но не полностью ... Я хотел бы понять, как именно это работает, и если есть обходной путь.

    Dim PatientMetricTypeID As Integer? = If(xml.@Type = "null",
                                 Nothing,
                                 CType([Enum].Parse(GetType(PatientMetricTypes), xml.@Type), Integer))

Блок № 2: Если

В этом случае все заканчивается как Ничто - ожидаемое поведение.

    Dim PatientMetricTypeID As Integer?

    If xml.@Type = "null" Then
        PatientMetricTypeID = Nothing
    Else
        PatientMetricTypeID = CType([Enum].Parse(GetType(PatientMetricTypes), xml.@Type), Integer)
    End If

Ответы [ 3 ]

8 голосов
/ 22 декабря 2010

Выражение If имеет тип Integer, а не Integer?.

ключевое слово Nothing VB.Net не эквивалентно null; это эквивалентно C # default(T), где T - это тип, в котором используется выражение.
Цитировать MSDN :

Ничего (Visual Basic)

Представляет значение по умолчанию для любого типа данных.

Когда вы пишете If(..., Nothing, SomeInteger), если If набрано как Integer, то Nothing превращается в 0.
Чтобы выражение If было напечатано как Integer?, вы можете заменить Nothing на New Integer?().

Для более подробного объяснения см. Мой блог .

1 голос
/ 22 декабря 2010

SLaks уже объяснил причину такого поведения. Это еще один способ обойти это:

... = If(xml.@Type = "null", DirectCast(Nothing, Integer?), ...)

Примерно год назад я зарегистрировал в Microsoft отчет об ошибке для этого:

Они рассматривают возможность добавления предупреждения об этом в следующий выпуск компилятора VB.

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

Мое предложение - использовать Integer? внутри CType вместо Integer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...