2008-10-21 5 views
5

Je ne trouve pas de réponse définitive. Depuis C# 2.0 vous avez été en mesure de déclarerHistorique de la syntaxe Nullable VB.NET

int? i = 125; 

comme raccourci pour désigner

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

Je me souviens avoir lu quelque part que VB.NET n'a pas permis à ce raccourci. Mais bas et voici, je l'ai essayé dans VS 2008 aujourd'hui et ça marche.

Est-ce que quelqu'un sait si c'est comme ça depuis .NET 2.0 ou est-ce que cela a été ajouté plus tard?

Répondre

13

System.Nullable a été introduit dans .Net 2.0 et est disponible pour VB comme type générique. Vous ne pouvez pas utiliser la syntaxe Nullable. Ainsi, dans VS 2005, vous pouvez faire:

Dim x as Nullable(of Integer) 

Je ne sais pas si l'équivalence fonctionne nulle et la boxe pour nullables en VB 2005, mais je soupçonne que la réponse est oui puisque l'équipe .Net a fait un changement de le 2.0 CLR pour accomplir la boxe avec des nullables. J'imagine que VB tire parti de cela.

En 2008, vous pouvez évidemment faire simplement:

Dim x as Integer? 
+0

L'équivalence nulle et la boxe ont fonctionné en VB 2005. Les changements en 2008 se sont concentrés sur l'ajout du "?" syntaxe, et la mise en œuvre de l'opérateur de levage. Une chose à noter, cependant, est ce soutien pour le "?" La syntaxe n'a pas été ajoutée au modèle de code/Code DOM VS Code. Par conséquent, tout code généré par un concepteur qui utilise des types Nullable utilisera toujours l'ancienne syntaxe générique. –

0

Je ne connais pas l'histoire, mais oui c'était une amélioration VS 2008.

+0

Pourquoi diable est-ce une réponse acceptée? –

3

il travaille en VB 2005 (dotnet 2.0), mais il est laid.

Vous ne pouvez pas l'utiliser comme une variable normale, je pensais que cela pourrait fonctionner comme un type d'objet, mais ce n'est pas le cas.

Plutôt que ceci:

dim oInt as object 

dim i as integer 

if oInt is nothing then 

    msgbox("int is null") 
else 

    i = cint(oInt) 

end if 

vous avez ce.

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 

Le problème ici est que si votre variable est nulle et il vous arrive d'invoquer la propriété de la valeur, il vomit jusqu'à une exception non gérée. Par exemple, mon préféré est celui-ci:

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

Vous obtiendrez une erreur d'exécution lorsque votre valeur Nullable supposée est nulle !!!

donc ici est annulable (integer) vs code objet

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

objet

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

Une façon plus simple d'ajouter le paramètre serait d'utiliser l'opérateur 'new' 'If': AddParamToSQLCmd (sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, If (oInt.HasValue, oInt.Value, DBNull.value)) La raison pour laquelle ce qui précède est que If est un opérateur Ahort-circuit alors que les deux côtés d'un appel de méthode IIf sont évalués, indépendamment du fait que le premier opérande soit vrai. –

1

IIRC, types nullables ont été introduits dans .NET 2.0 à stade très tardif. L'équipe du compilateur C# a réussi à entasser plus de support de langage pour eux que l'équipe VB.NET. L'équipe VB.NET a plus ou moins rattrapé VS2008. C'est pourquoi vous pouvez, par exemple, utiliser l'opérateur == pour comparer les valeurs NULL dans C# 2.0 alors que dans VB.NET vous devez utiliser la méthode Nullable.Equals(). Grrr.