C # Opérateur conditionnel et coulée d'octet implicite: un problème de sécurité de type
L'utilisation de l'opérateur conditionnel (? :
) avec une coulée d'octet implicite peut entraîner des erreurs de compilation en C #. Par exemple, aByteValue = aBoolValue ? 1 : 0;
apparaît simple mais échoue en raison de l'incompatibilité des types.
Le système de typage fort de C # nécessite des types compatibles dans les affectations. Le type de l'opérateur conditionnel est déterminé par ses expressions vraies et fausses. Dans l'exemple, 1
et 0
sont des entiers, ce qui fait de l'expression entière un entier. L'attribution de cet entier à une variable byte
(aByteValue
) est problématique car A byte
a une plage plus petite qu'un int
. Le compilateur empêche cette conversion implicite pour maintenir la sécurité du type.
La solution implique une coulée explicite: aByteValue = aBoolValue ? (byte)1 : (byte)0;
. Cela convertit explicitement les littéraux entiers en octets, résolvant l'inadéquation de type.
Ce comportement découle du mécanisme d'inférence de type C #, qui hiérarte la détermination des types d'expression indépendamment de leurs cibles d'attribution. Cela garantit la sécurité des types même avec plusieurs cibles d'attribution de types variables.
La seule exception à cette règle est avec les expressions de Lambda, où l'inférence du type contextuel est utilisée pour la compatibilité avec le code environnant.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!