История VB.NET Nullable синтаксиса - PullRequest
5 голосов
/ 22 октября 2008

Я не могу найти окончательный ответ. Начиная с C # 2.0 вы можете объявить

int? i = 125;

как сокращение для

Nullable<int> i = Nullable<int>(123);

Я помню, что читал где-то, что VB.NET не разрешал этот ярлык. Но неважно, сегодня я попробовал его в VS 2008, и он работает.

Кто-нибудь знает, было ли это так с .NET 2.0 или было добавлено позже?

Ответы [ 4 ]

13 голосов
/ 22 октября 2008

System.Nullable был представлен в .Net 2.0 и доступен для VB как универсальный тип . Вы просто не можете использовать обнуляемый синтаксис. Так что в VS 2005 вы можете сделать:

Dim x as Nullable(of Integer)

Я не знаю, работает ли нулевая эквивалентность и бокс для nullables в VB 2005, но я подозреваю, что ответ - да, так как .Net команда внесла изменения в 2.0 CLR, чтобы выполнить бокс с nullables. Я полагаю, VB использует это.

В 2008 году вы, очевидно, можете просто сделать:

Dim x as Integer?
3 голосов
/ 19 ноября 2008

работает в VB 2005 (dotnet 2.0), но ужасно.

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

Вместо этого:

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, то это вызывает необработанное исключение.

так, например, мой любимый это.

AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value))

Приведет к ошибке во время выполнения, когда ваше Предполагаемое значение Nullable равно нулю !!!

так что это nullable (целое число) против кода объекта

обнуляемый (целого числа)

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

Object

AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt)
1 голос
/ 08 июня 2009

IIRC, типы Nullable были введены в .NET 2.0 на очень поздней стадии. Команде компиляторов C # удалось втиснуть в них больше языковой поддержки, чем команда VB.NET. Команда VB.NET более или менее увлеклась VS2008. Вот почему вы можете, например, использовать оператор == для сравнения значений NULL в C # 2.0, тогда как в VB.NET вам пришлось мириться с методом Nullable.Equals (). Хмм.

0 голосов
/ 22 октября 2008

Я не знаю историю, но да, это было улучшение VS 2008.

...