2008-10-21 8 views
5

No puedo encontrar una respuesta definitiva. Puesto que C# 2.0 que ha sido capaz de declararHistorial de la sintaxis Vulnerable de VB.NET

int? i = 125; 

como forma abreviada de

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

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

¿Alguien sabe si ha sido así desde .NET 2.0 o fue agregado más tarde?

Respuesta

13

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

Dim x as Nullable(of Integer) 

no sé si la equivalencia nula y el boxeo trabaja para nullables en VB 2005, pero yo sospecho que la respuesta es sí, ya que el equipo .Net realiza un cambio en el 2.0 CLR para lograr el boxeo con elementos nulables. Me imagino que VB aprovecha esto.

En 2008, es obvio que puede simplemente hacer:

Dim x as Integer? 
+0

La equivalencia nula y el boxeo funcionaron en VB 2005. Los cambios en 2008 se centraron en agregar el "?" sintaxis, y la implementación del levantamiento del operador. Una cosa a tener en cuenta, sin embargo, es ese apoyo para el "?" la sintaxis no se agregó al Modelo de código VS/Código DOM, de modo que cualquier código generado por el diseñador que use tipos anulables siempre usará la sintaxis genérica antigua. –

0

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

+0

¿Por qué esta es una respuesta aceptada? –

3

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

sufre esta enfermedad.

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 la variable es nula y le sucede a invocar la propiedad Value se barfs hasta una excepción no controlada.

por lo que, por ejemplo, mi favorito es este.

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í está anulable (de número entero) vs Código objeto

anulable (de número 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) 
+1

Una forma más sencilla de agregar el parámetro sería hacer uso del operador 'nuevo' 'If': AddParamToSQLCmd (sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, If (oInt.HasValue, oInt.Value, DBNull.value)) La razón de que lo anterior funcione es que If es un operador de circuito de dos salidas mientras que ambos lados de una llamada al método IIf se evalúan, independientemente de si el primer operando se evalúa como verdadero. –

1

IIRC, se introdujeron tipos anulables 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.

Cuestiones relacionadas