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?
3 Réponses :
Depuis MSDN : p >
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
.
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.
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
estfalse
), le résultat est la valeurnull
de typeT?
.- Sinon, la conversion est évaluée comme un déroulement de
S?
versS
, suivi de la conversion sous-jacente deS à
T
, suivi d'un encapsulation deT
à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
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.
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
Le compilateur ne peut pas convertir implicitement 'long' en 'int'
Et selon MSDN
L'opérateur as est comme une opération de transtypage. Cependant, si la conversion n'est pas possible, car renvoie null au lieu de lever une exception.
Donc, avec votre code, la conversion n'est pas possible, tout comme renvoyer Null.
long?
n'est pas la même chose que long
- vous ne pouvez vraiment pas appliquer as
aux conversions de type valeur. Donc pas clair comment cela s'applique à la question. (Faites-moi savoir si vous voulez que je décote aussi en plus de commenter - normalement, il est considéré comme une mauvaise pratique de faire les deux en raison de représailles régulières de la part des auteurs des articles)
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.