2010-12-14 46 views
3

Je me suis débarrassé de mon comportement inattendu à cause de nombres entiers nullables.La définition de l'entier nullable sur une chaîne ne contenant rien 0

  • Si je mets un Integer-Nothing, il devient Nothing comme prévu.
  • Si je mets un Integer? à un String qui est Nothing, il devient 0!

Bien sûr, je reçois ceci si je lance explicitement le String à Integer? ou non.

Je me rends compte que je pourrais travailler autour de cela assez facilement, mais je veux savoir ce qui me manque.

Dim NullString As String = Nothing 
    Dim NullableInt As Integer? = CType(NullString, Integer?) 'Expected NullableInt to be Nothing, but it's 0! 
    NullableInt = Nothing 'This works, of course. NullableInt is Nothing. 

EDIT: Auparavant, j'avais mon code ici sans la conversion explicite à Integer? et tout le monde semblait être obsédés par/confus par cela. Il y avait beaucoup de suggestions qu'Option Strict On attraperait ce genre de chose. Cependant, il s'agit en réalité d'une bizarrerie des règles de conversion chaîne-entier qui sont antérieures aux types nullables, mais qui les influencent tout de même.

+1

Utilisez Option Strict On pour détecter rapidement ce type d'erreur. –

+0

Pourquoi attribuez-vous une variable chaîne à un INTEGER Nullable? Acceptez d'activer Option Strict On –

+0

Vous pouvez activer Option Strict un fichier à la fois en plaçant Option Strict On. Cela devrait vous permettre de gérer les erreurs pendant que vous travaillez sur le fichier. Cela vaut vraiment la peine à long terme –

Répondre

6

La raison à cela concerne les règles de conversion VB.Net ici. Le type String est incompatible avec Integer? et, par conséquent, une conversion a lieu. L'étape intermédiaire convertit cependant String en Integer. Les règles de conversion VB.Net convertiront un Nothing ou vide String dans la valeur Integer 0. Cela peut être reproduit sans nullables

Dim local1 As String = Nothing 
Dim local2 As Integer = local1 ' It's 0 

Cette même conversion convertit alors la valeur 0 Integer au type Integer? qui maintient le Integer valeur.

+0

+1: Wow, donc je dois sérieusement écrire ma propre petite conversion pour ça? Cela semble être une sauce faible. –

+0

@Brian MacKay: Je dirais que interpréter la chaîne vide '" "' comme un 'Nullable (Of Integer)' sans valeur est une logique personnalisée assez spécifique, et que vous devriez * avoir * à écrire votre propre conversion si c'est le comportement que vous voulez (les bonnes nouvelles sont que c'est facile!). Juste mes deux cents. –

+0

@Dan Tao: Mais la chaîne n'est pas String.Empty, c'est Null. –

0

POURQUOI essayez-vous d'attribuer une chaîne à un nombre entier ????

Dim nullInt As Nullable(Of Integer) 'nullInt = Nothing as expected 

    'the following should NOT compile and won't with Option Strict On 

    nullInt = "" 
    nullInt = String.Empty