Maison > développement back-end > C++ > Pourquoi l'opérateur conditionnel de C# (?:) échoue-t-il parfois à la conversion de type implicite ?

Pourquoi l'opérateur conditionnel de C# (?:) échoue-t-il parfois à la conversion de type implicite ?

Mary-Kate Olsen
Libérer: 2025-01-24 13:47:09
original
366 Les gens l'ont consulté

Limitations implicites de la conversion de type de l'opérateur conditionnel C# (?:)

L'opérateur conditionnel de C# (?:) fournit une syntaxe de branche conditionnelle concise. Cependant, il présente parfois un comportement inattendu en matière de conversions de types implicites.

Considérez l'extrait de code suivant :

<code class="language-csharp">bool aBoolValue;
byte aByteValue;

// 这段代码可以成功编译
if (aBoolValue) 
    aByteValue = 1; 
else 
    aByteValue = 0;

// 这段代码编译失败,并出现错误:“无法将类型“int”隐式转换为“byte”。
aByteValue = aBoolValue ? 1 : 0;</code>
Copier après la connexion

Pourquoi le premier extrait de code est-il compilé, mais le deuxième extrait de code échoue ?

Le rôle de l'inférence de type en C#

Lorsque le compilateur analyse le code, il détermine les types de variables et d'expressions en fonction du contexte dans lequel elles sont utilisées. Ce processus est appelé inférence de type. En règle générale, l'inférence de type est déduite de l'extérieur de l'expression, et non de l'intérieur.

Dans le premier extrait de code, le compilateur déduit le type de aByteValue en fonction des affectations sur chaque branche de l'instruction if-else : aByteValue se voit attribuer une valeur de 1 ou 0, qui sont tous deux des octets. Par conséquent, le compilateur déduit que aByteValue est un octet.

Signification de l'expression conditionnelle

L'opérateur conditionnel évalue deux expressions : l'expression résultat et l'expression alternative. Le type de l’expression conditionnelle est le type le plus général des deux expressions.

Dans le deuxième extrait de code, l'expression de résultat et l'expression alternative sont évaluées sous forme de nombres entiers (1 et 0 respectivement). Par conséquent, le compilateur déduit que l’expression conditionnelle est de type int.

Convertir en type compatible

Étant donné que l'expression conditionnelle est évaluée comme un entier, elle ne peut pas être implicitement convertie en octet. Pour résoudre ce problème, vous devez convertir explicitement l'expression en octet, comme indiqué dans le code suivant :

<code class="language-csharp">aByteValue = aBoolValue ? (byte)1 : (byte)0;</code>
Copier après la connexion

Why Does C#'s Conditional Operator (?:) Sometimes Fail Implicit Type Casting?

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal