Значение по умолчанию для целого числа, допускающего значение NULL, отличается в функции If()

Я пытаюсь понять, почему два примера кода ведут себя по-разному. Я всегда считал, что функция If() имитирует языковую функцию If. Или я смотрю на поведение Nullable(Of Integer), которое вызывает это?

Пример 1:

If Not String.IsNullOrWhiteSpace(PC.SelectedValue) Then

    Dim pcFilter1 As Integer? = CInt(PC.SelectedValue)

Else

    Dim pcFilter1 As Integer? = Nothing

End If

Пример № 2:

Dim pcFilter2 As Integer? = If(Not String.IsNullOrWhiteSpace(PC.SelectedValue),
                               CInt(PC.SelectedValue),
                               Nothing)

Результат:

pcFilter1 = ничего

пкФильтр2 = 0


person motto    schedule 07.12.2010    source источник


Ответы (1)


В примере № 2 проблему вызывает приведение CInt. Конструкция If() пытается определить общий тип для второго и третьего параметров. Рассматривая 2-й параметр как целое число, он затем преобразует Nothing в целое число, что из-за магического приведения VB приводит к 0. например.

Dim i As Integer = Nothing 'results in i being set to 0

Чтобы получить то, что вы хотите с помощью If(), попробуйте следующее:

Dim pcFilter2 As Integer? = If(Not String.IsNullOrWhiteSpace(PC.SelectedValue),
                           New Integer?(CInt(PC.SelectedValue)),
                           Nothing)
person Dustin Hodges    schedule 07.12.2010