Pregunta

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 permitía este acceso directo. Pero bajo y he aquí, lo probé en VS 2008 hoy y funciona.

¿Alguien sabe si ha sido así desde .NET 2.0 o se agregó más tarde?

¿Fue útil?

Solución

System.Nullable se introdujo en .Net 2.0 y está disponible para VB como un tipo genérico . Simplemente no puedes usar la sintaxis que puede ser nula. Así que en VS 2005 puedes hacer:

Dim x as Nullable(of Integer)

No sé si la equivalencia nula y el boxeo funcionan para nullables 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 nullables. Me imagino que VB aprovecha esto.

En 2008, obviamente puedes hacerlo:

Dim x as Integer?

Otros consejos

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

No puedes usarlo como una variable normal, pensé que podría funcionar como un tipo de Objeto pero no lo hace.

En lugar 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

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 y usted invoca la propiedad Value, presenta una excepción no controlada.

así, por ejemplo, mi favorito es este.

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

¡Resultará en un error de tiempo de ejecución cuando su valor de Nullable Supuesto sea nulo!

así que aquí hay nullable (de entero) vs código de objeto

anulable (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 tardía. 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 nullables en C # 2.0 mientras que en VB.NET tuvo que soportar el método Nullable.Equals (). Grrr.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top