visual variable property not net empty diferente vb.net syntax nullable

vb.net - property - variable null vb net



Historia de la sintaxis Nullable de VB.NET (4)

No conozco la historia, pero sí fue una mejora de VS 2008.

No puedo encontrar una respuesta definitiva. Desde C # 2.0 has podido declarar

int? i = 125;

como taquigrafía para

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

Recuerdo haber leído en alguna parte que VB.NET no permitió este atajo. Pero bajo y he aquí, lo intenté en VS 2008 hoy y funciona.

¿Alguien sabe si ha sido así desde .NET 2.0 o se agregó después?


System.Nullable se introdujo en .Net 2.0 y está disponible para VB como un tipo genérico . Usted simplemente no puede usar la sintaxis nullable. Entonces en VS 2005 puedes hacer:

Dim x as Nullable(of Integer)

No sé si la equivalencia nula y el boxeo funcionan para nulables en VB 2005, pero sospecho que la respuesta es sí, ya que el equipo de .Net realizó un cambio en el CLR 2.0 para lograr el boxeo con nulables. Me imagino que VB aprovecha esto.

En 2008, obviamente puede simplemente hacer:

Dim x as Integer?


funciona en VB 2005 (dotnet 2.0) pero es feo.

No puede usarlo como una variable normal, pensé que podría funcionar como un tipo de objeto pero no es así.

En vez de esto:

dim oInt as object dim i as integer if oInt is nothing then msgbox("int is null") else i = cint(oInt) end if

Tu tienes esto.

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

El problema aquí es que si su variable es nula e invocará la propiedad Value, mostrará una excepción no controlada.

así que, por ejemplo, mi favorito es esto.

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

¡Causará un error de tiempo de ejecución cuando su valor de Supposed Nullable sea nulo!

así que aquí es nullable (de entero) vs Código de objeto

nullable (de entero)

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

Objeto

AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt)


IIRC, los tipos anulables se introdujeron en .NET 2.0 en una etapa muy avanzada. El equipo del compilador de C # logró incluir más soporte de idiomas para ellos que el equipo de VB.NET. El equipo de VB.NET más o menos atrapado en VS2008. Es por eso que puede, por ejemplo, usar el operador == para comparar elementos nulables en C # 2.0, mientras que en VB.NET debe soportar el método Nullable.Equals (). Grrr.