HasValue дает значение 0 вместо Nothing - PullRequest
0 голосов
/ 17 мая 2018

Вопрос прост, когда я передаю CustomClass, который является Nothing в Run метод, в конце в Query метод second.HasValue показывает 0. Не должно быть Nothing?

Public Function Run() As Boolean
       Return Query(if(CustomClass IsNot Nothing, CustomClass.Id, Nothing))
End Function

Public Function Query(second As Integer?) As Boolean
    ...
    If second.HasValue Then
        'value = 0 !
        Else
           'some query
        End If

    ...
End Function

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Это странность VB.NET.Nothing означает не только null (C #) , но также default (C #) .Таким образом, он вернет значение по умолчанию для данного типа.По этой причине вы даже можете присвоить Nothing переменной Integer (или любому другому типу ссылки или значения).

В этом случае компилятор решил, что Nothing означает значение по умолчанию Integer, которое равно 0. Почему?Потому что ему нужно найти неявное преобразование в Id -свойство, которое равно Int32.

Если вы хотите Nullable(Of Int32), используйте:

Return Query(if(CustomClass IsNot Nothing, CustomClass.Id, New Int32?()))

Поскольку я упомянул C #, если вы попробуете то же самое там, вы получите ошибку компилятора, что не существует неявного преобразования между null и int.В VB.NET есть один, значение по умолчанию 0.

0 голосов
/ 17 мая 2018

Причиной является встроенное If -общение.

Возвращается Integer вместо Integer?, поскольку CustomClass.Id, по-видимому, имеет тип Integer.

Таким образом, вы можете определить CustomClass.Id как Integer? или использовать CType для преобразования его в Integer? во встроенном If.

Public Function Run() As Boolean
    Return Query(if(CustomClass IsNot Nothing, CType(CustomClass.Id, Integer?), Nothing))
End Function
...