работает в VB 2005 (Dotnet 2,0), но это некрасиво.
Вы не можете использовать его как обычную переменную, я думал, что это может работать как тип объекта, но это не так.
Вместо этого:
dim oInt as object
dim i as integer
if oInt is nothing then
msgbox("int is null")
else
i = cint(oInt)
end if
у вас есть это.
Dim oInt as nullable(of integer)
dim i as integer
if oInt.HasValue = false then
msgbox("int is null")
else
i = oInt.Value
end if
Проблема здесь состоит в том, что если переменная равна нуля, и вы случайно вызвать свойство Value оно barfs до необработанного исключения.
так, например, мой любимый это.
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value))
Приведёт к ошибке во время выполнения, когда ваше допустимое значение Nullable равно null!
так вот обнуляемый (целочисленный) против кода объекта
обнуляемого (целочисленный)
if oInt.HasValue then
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt.Value)
else
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, dbnull.value)
end if
объектов
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt)
Нулевая эквивалентность и бокс работали в VB 2005. Изменения в 2008 году были сосредоточены на добавлении «?» синтаксиса и внедрения оператора. Следует отметить, однако, что поддержка «?» синтаксис не был добавлен в VS Code Model/Code DOM, поэтому любой созданный конструктором код, который использует типы с нулевым значением, всегда будет использовать старый общий синтаксис. –