Pourquoi la première instruction est autorisée mais pas la seconde dans l'exemple de code ci-dessous?

sbyte test1 = true ? 1 : -1;             // Allowed
sbyte test2 = "a".Equals("b") ? 1 : -1;  // Not allowed

J'ai vérifié que toutes les .Equals(..) surcharges pour string renvoient un bool.

0
shashwat 15 mars 2021 à 06:55

1 réponse

Meilleure réponse

La première instruction comprend une expression constante qui peut être évaluée au moment de la compilation. C'est équivalent à ceci:

sbyte test1 = 1;

Techniquement, il s'agit d'une affectation d'un littéral int (1) à une variable sbyte. Mais le compilateur est assez intelligent pour comprendre que la valeur est suffisamment petite pour tenir dans une plage sbyte et permet une conversion implicite, c'est-à-dire que vous n'avez pas besoin de la convertir en int.

La deuxième instruction comprend un appel de méthode et ceux-ci ne sont évalués qu'au moment de l'exécution. En d'autres termes, le compilateur n'est pas assez intelligent pour simplifier une expression. La seule chose qu'il sait, c'est que cette impression renvoie une valeur int inconnue et que celles-ci doivent être converties explicitement. Par exemple, comme ceci:

sbyte test2 = (sbyte) ("a".Equals("b") ? 1 : -1);

Tout cela est expliqué dans la spécification C #. Voir, Conversions d'expressions constantes implicites:

Une expression_ constante ( Expressions constantes < / a>) de type int peut être converti en type sbyte, byte, short, ushort, uint ou ulong, à condition que la valeur de constant_expression se trouve dans la plage du type de destination.

3
default locale 15 mars 2021 à 04:12