История создания VB.NET синтаксис, допускающий обнуление
Я не могу найти окончательного ответа. Начиная с C# 2.0 вы можете объявить
int? i = 125;
Как сокращение для
Nullable<int> i = Nullable<int>(123);
Я, помнится, где-то читал, что VB.NET не позволял этот короткий путь. Но низко и вот, я попробовал его в VS 2008 сегодня, и это работает.
Кто-нибудь знает, было ли это так с .NET 2.0 или это было добавлено позже?
4 ответов:
Система.Nullable был введен в .Net 2.0 и доступен для VB как универсальный тип. Вы просто не можете использовать синтаксис nullable. Так что в VS 2005 вы можете сделать:
Dim x as Nullable(of Integer)Я не знаю, работает ли null equivalence и boxing для nullables в VB 2005, но я подозреваю, что ответ да, так как команда .Net внесла изменения в CLR 2.0 для выполнения boxing с nullables. Я бы предположил, что VB использует это.
В 2008 году вы, очевидно, можете просто сделать:
Dim x as Integer?
Он работает в 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Проблема здесь заключается в том, что если переменная имеет значение null и вы случайно вызываете свойство Value, оно вызывает необработанное исключение.
Так, например, мой любимый-вот это.AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value))Приведет к ошибке во время выполнения, когда ваш предполагаемый Значение равно null!!!
Итак, вот nullable (of integer) vs Object code
Nullable (of integer)
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)
IIRC, nullable типы были введены в .NET 2.0 на очень поздней стадии. Команда компиляторов C# сумела втиснуть в них больше языковой поддержки, чем VB.NET команда сделала это. Тот самый VB.NET команда более или менее догнала VS2008. Вот почему вы можете, например, использовать оператор == для сравнения nullables в C# 2.0, тогда как в VB.NET ты должен был смириться с тем, что тебя не признают.Метод Equals (). Гррр.
Comments