6
votes

Pourquoi `as` donne null pour les types de valeur Nullable?

long? i = 10000;
int? s = i as int?;
Why is it giving me a null in s variable? I know that casting it using int? s = (int?)i; will work fine but why can't I use an as operator?

1 commentaires

L'opérateur as renvoie null si l'expression est d'un type différent, il ne tente pas de la convertir. Lorsque vous utilisez (int?) I , vous appelez en fait un opérateur explicite (pas un cast) pour convertir la valeur.


3 Réponses :


9
votes

Depuis MSDN :

Le code est équivalent à l'expression suivante, sauf que la variable d'expression n'est évaluée qu'une seule fois.

expression est de type? (type) expression: (type) null

Puisque i est int? est faux, le mot-clé as renverra (int?) null .


2 commentaires

si je peux utiliser as dans les types de valeur Nullable mais il retournera toujours null alors pourquoi ils l'autorisent?


Vous pouvez l'utiliser pour les valeurs Nullable. Exemple: var s = i as object; ne renvoie pas null car int? est un objet. int? n'est pas un long? cependant.



3
votes

Les types ne sont pas équivalents et vous obtenez null, c'est ainsi que fonctionne as

Cependant, vous pouvez simplement diriger Cast

long? i = 10000;
var s = (int?)i;

// or even better make sure its *checked* 

var s = checked((int?)i);

Pourquoi cela fonctionne-t-il?

Spécification du langage C # 11.6.1 Conversions nulles

...

Évaluation d'une conversion Nullable basée sur une conversion sous-jacente de S à T procède comme suit:

  • Si la conversion Nullable est de S? à T? :
  • Si la valeur source est nulle (la propriété HasValue est false ), le résultat est la valeur null de type T? .
  • Sinon, la conversion est évaluée comme un déroulement de S? vers S , suivi de la conversion sous-jacente de S à T , suivi d'un encapsulation de T à T? .

...

car ne fait pas cela, il vérifie les types d'exécution, s'ils ne sont pas égaux renvoie null T?


Ressources supplémentaires

coché (Référence C #)

Le mot-clé vérifié est utilisé pour activer explicitement la vérification de dépassement de capacité opérations et conversions arithmétiques de type intégral.

#Mise à jour à partir des commentaires

J'ai compris que nous ne pouvons pas convertir et pourquoi nous ne pouvons pas le faire, mais pourquoi ils le sont suggérant qu'il y a un scénario où cela sera utile i'e certains lien d'image aléatoire de l ' Erreur du compilateur CS0077 "L'opérateur as doit être utilisé avec un type référence ou un type Nullable ('int' est un type valeur non Nullable)."

La raison est (dans votre exemple d'image) qu'un type de valeur ne peut pas être nul, il ne pourrait jamais fonctionner avec lui. Ce qui vous manque, c'est qu'il existe des exemples plus complexes de ce qui pourrait arriver, vous pouvez définir des opérateurs implicites sur des types personnalisés, etc.


4 commentaires

si je peux utiliser as dans les types de valeur Nullable mais il retournera toujours null alors pourquoi ils l'autorisent?


@avinash as ne fonctionne pas car il vérifie les vérifications des types


J'ai compris que nous ne pouvons pas convertir et pourquoi nous ne pouvons pas le faire, mais pourquoi ils suggèrent qu'il existe un scénario où cela sera utile ss


@avinash mis à jour