Проблема с .NET-троичным оператором и преобразованием типов - PullRequest
2 голосов
/ 26 марта 2019

У меня есть троичное выражение, которое проверяет, является ли Object значением DBNull.Value, и возвращает Nothing, если True, иначе, если False возвращает значение, преобразованное в тип Date этого Object,Однако по какой-то странной причине моя переменная DateTime, которая устанавливается троичным выражением, таинственным образом установлена ​​на '1/1/0001 12:00:00 AM', хотя Object, безусловно, является DBNull.Value.Кто-нибудь еще может воспроизвести это поведение?Если так, то почему это происходит?

Странная часть в том, что я изменил это выражение на обычные старые блоки if и else, и я совсем не понимаю этого поведения.Таким образом, это должно быть как-то связано с троичным утверждением.

Module Module1

Sub Main()
    Dim dt As New DataTable
    dt.Columns.Add(New DataColumn("DateColumn", GetType(String)))
    dt.Rows.Add()
    Dim testDate = dt(0).Item(0)
    Dim setDate As DateTime? = Nothing
    'Doesn't work
    setDate = If(testDate Is DBNull.Value, Nothing, CDate(testDate))
    'Works
    'If testDate Is DBNull.Value Then
    '    setDate = Nothing
    'Else
    '    setDate = CDate(testDate)
    'End If
    'Also works
    'setDate = If(testDate Is DBNull.Value, Nothing, CType(testDate, DateTime?))
    'This works too
    'setDate = If(testDate Is DBNull.Value, Nothing, testDate)
    'Working
    'setDate = IIf(testDate Is DBNull.Value, Nothing, testDate)
    If setDate IsNot Nothing Then
        Console.WriteLine("Why does setDate = '" & setDate.ToString & "' ?!")
    End If
    Console.ReadKey()
End Sub

End Module

Я хотел бы использовать троичное выражение, потому что оно меньше кода.

1 Ответ

2 голосов
/ 26 марта 2019

Причина в том, что VB выводит тип возврата оператора If как Date, потому что это то, что возвращает CDate.Ключевое слово Nothing может быть преобразовано в необнуляемый объект Date, так как Nothing также означает «по умолчанию» в VB, а значение Date по умолчанию равно 1/1/0001 12:00:00 AM.Чтобы это исправить, вы должны убедиться, что хотя бы один из параметров явно равен DateTime?.

Например, это будет работать:

setDate = If(testDate Is DBNull.Value, New DateTime?, CDate(testDate))
...