C # Pièges de l'opérateur conditionnel: problèmes de coulée implicites
L'opérateur conditionnel de C # (? :
) fournit un moyen compact d'effectuer des affectations conditionnelles. Cependant, un problème commun survient lorsqu'il s'agit de conversions de type. Examinons ce scénario:
<code class="language-csharp">bool aBoolValue; byte aByteValue;</code>
Utilisation d'une instruction if-else
:
<code class="language-csharp">if (aBoolValue) aByteValue = 1; else aByteValue = 0;</code>
Cela compile sans erreurs. Mais en utilisant l'opérateur conditionnel:
<code class="language-csharp">aByteValue = aBoolValue ? 1 : 0;</code>
produit une erreur "ne peut pas convertir implicitement de type 'int' en 'byte'".
Comprendre la cause racine
Le compilateur évalue l'expression conditionnelle de l'intérieur à l'extérieur. Les valeurs littérales 1
et 0
sont traitées comme des entiers (int
). Par conséquent, le type de l'expression conditionnelle entière est int
. C # ne convertit pas implicitement int
en byte
sauf si le compilateur peut garantir que la valeur int
est dans la plage de byte
(0-255). Puisque le aBoolValue
n'est pas une constante, le compilateur ne peut pas faire cette garantie.
La solution: coulée explicite
La solution consiste à lancer explicitement le résultat de l'expression à un byte
:
<code class="language-csharp">aByteValue = aBoolValue ? (byte)1 : (byte)0;</code>
Cela indique explicitement au compilateur notre intention de convertir le résultat int
en a byte
, résolvant l'erreur de compilation.
Cet exemple souligne la nécessité d'une considération attentive des conversions de type implicite lors de l'utilisation de l'opérateur conditionnel. Bien qu'il offre une syntaxe concise, la compréhension de son comportement de manipulation de type et l'utilisation de moulages explicites si nécessaire est essentiel pour éviter les erreurs de compilation inattendues.
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!