2008-10-21 4 views
5

Я не могу найти окончательный ответ. Так как C# 2.0 вы были в состоянии объявитьИстория VB.NET Синтаксис Nullable

int? i = 125; 

как стенография для

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

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

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

ответ

13

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

Dim x as Nullable(of Integer) 

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

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

Dim x as Integer? 
+0

Нулевая эквивалентность и бокс работали в VB 2005. Изменения в 2008 году были сосредоточены на добавлении «?» синтаксиса и внедрения оператора. Следует отметить, однако, что поддержка «?» синтаксис не был добавлен в VS Code Model/Code DOM, поэтому любой созданный конструктором код, который использует типы с нулевым значением, всегда будет использовать старый общий синтаксис. –

0

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

+0

Почему это приемлемый ответ? –

3

работает в 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) 
+1

Простым способом добавления параметра было бы использовать оператор «new» If: AddParamToSQLCmd (sqlCmd, «@SomeID», SqlDbType.Int, 0, ParameterDirection.Input, If (oInt.HasValue, oInt.Value, DBNull.value)) Причина, по которой выше сказанное заключается в том, что If является оператором акорт-схемы, тогда как обе стороны вызова метода IIf оцениваются независимо от того, соответствует ли первый операнд истинному. –

1

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

Смежные вопросы