История создания VB.NET синтаксис, допускающий обнуление



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



int? i = 125;


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



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


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



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

558   4  

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 (). Гррр.

Я не знаю историю, Но да, это было улучшение по сравнению с 2008 годом.

Comments

    Ничего не найдено.