Pourquoi ne puis-je pas utiliser '??' opérande pour le Système.DBNull valeur?

StackOverflow https://stackoverflow.com/questions/3213125

  •  13-09-2020
  •  | 
  •  

Question

J'ai un Oracle tableau de données de l'extraction de colonnes que la valeur null.J'ai donc figure de conserver le code simple et sympathique que j'utiliserais ??l'opérande.AlternatePhoneNumber est une chaîne de caractères dans mon modèle C#.

AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""

Cependant, même avec ce code j'obtiens toujours l'erreur.

System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.

Je sais que l'erreur, mais pourquoi ??pas utilisable sur DBNull?N'est pas nulle et DBNull essentiellement la même chose?

Je vous remercie.

Était-ce utile?

La solution

L' ?? l'opérateur ne s'applique qu'à de véritables nulls.

null et DBNull.Value ne sont pas les mêmes; DBNull.Value est tout simplement un espace réservé à l'objet.

Aussi, cette exception est venue de l'intérieur de l' AlternatePhoneNumber bien, avant que votre ?? opérateur exécute.(Votre code n'est pas un plâtre).

Si customer est une ligne dans un dataset typé, le changement de la colonne NullValue propriété dans le concepteur.

Autres conseils

null et dbnull ne sont pas les mêmes.System.dbnull est un objet réel.

Le problème est que AlternatePhoneNumber est une chaîne.Dbnull n'est pas.

Essayez cela à la place:

AlternatePhoneNumber = (customer.AlternatePhoneNumber as string) ?? ""

Faites ceci:

public T IfNull<T>(object o, T value)
{
   return (o == DbNull.Value) ? value : (T)o;       
}

DBNULL est un type avec une valeur unique et n'est pas identique à une référence de chaîne nulle, laquelle est la raison pour laquelle vous ne pouvez pas utiliser ??.Vous pouvez le faire cependant:

string alternativePhoneNumber = DBNull.Value.Equals(customer) ? string.Empty : ((Customer)customer).AlternatePhoneNumber;

Comme d'autres réponses de l'état, null signifie une référence qui fait référence à aucun objet, alors que l' DBNull est une classe fournie par ADO.NET pour indiquer lorsqu'un champ ou une valeur NULL dans la base de données (ou dans un DataTable).

Alors que vous pouvez utiliser la conditionnel (ternaire) opérateur (?:) pour faire ce que vous voulez:

AlternatePhoneNumber = customer.AlternatePhoneNumber is DBNull 
                           ? "" 
                           : customer.AlternatePhoneNumber;

J'ai tendance à résumer dans un méthode d'extension:

static class NullExtensions
{
    public static T WhenNull<T>( this object value, T whenNullValue )
    {
        return (value == null || value is DBNull)
            ? whenNullValue
            : (T)value;
    }
}

qui je trouve rend le code plus facile à lire et à comprendre.

AlternatePhoneNumber = customer.AlternatePhoneNumber.WhenNull( "" );

dbnull n'est pas un vrai "NULL".

le "??"- L'opérateur ne détecte que NULL - références, pas d'objets qui imitent le comportement "NULL".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top