Sin int implícito -> conversión corta en la declaración ternaria
-
16-09-2019 - |
Pregunta
short s;
s = (EitherTrueOrFalse()) ? 0 : 1;
Esta falla con:
CS0266 de error: No se puede implícitamente convertir el tipo 'int' a 'corto'. Un existe conversión explícita (que son falta un yeso?)
Puede alguien explicar por qué esto es así? La única cosa que puedo pensar es que el compilador no se fija en el segundo valor y no sabe el rango entre los dos, en el caso que escribí algo así como
short s;
s = (EitherTrueOrFalse()) ? 0 : 65000;
correcta? La única solución es con un reparto feo?
Además, parece que C # no tiene un sufijo tipo para el tipo corto. Esa es una bonita tumba supervisión de la OMI. De lo contrario, eso hubiera sido una solución ...
Solución
El compilador tiene una conversión implícita de un constante expresión de diversos tipos primitivos (siempre y cuando el valor está dentro del rango apropiado), pero aquí la expresión no es constante - es sólo un int expresión. Es más o menos lo mismo que:
short s;
s = CallSomeMethodReturningInt32();
en lo que se refiere al compilador.
Hay dos opciones - se puede echar toda la expresión, o emitir cada una de las dos últimas operandos:
short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;
para hacer el short
general Tipo de expresión. En este caso en particular, es una lástima que no hay un sufijo literal numérico para declarar explícitamente una short
literal. Al parecer, los diseñadores del lenguaje tuvo en cuenta esto, pero sintieron que era una situación relativamente rara. (Creo que probablemente estaría de acuerdo.)
La parte sobre las conversiones constantes implícitas es del C # 3.0 sección spec 6.1.8:
6.1.8 implícitos constantes conversiones de expresión
Una constante implícita conversión permite la expresión siguientes conversiones:
- A constante-expresión (§7.18) de tipo
int
se puede convertir al tipo sbyte,byte
,short
,ushort
,uint
oulong
, siempre que el valor de la expresión-constante está dentro de la rango del tipo de destino.- A expresión-constante de tipo
long
puede ser convertido para escribirulong
, siempre el valor de la expresión-constante No es negativo.
Otros consejos
Debido a que el Reparto se realiza por el compilador , no en tiempo de ejecución, yo no lo llamaría un reparto feo, yo diría que es una sintaxis complicada:
s = (EitherTrueOrFalse()) ? (short)0 : (short)1;
Es decir, esta es la forma en que está escrito en C #, incluso si se ve feo.
Vea este artículo de blog . Ver de Marc Gravell respuesta sobre esta cuestión.
supongo que esto tiene la misma razón que esto no compilará:
short s1 = GetShort1();
short s2 = GetShort2();
short s3 = s1 + s2;
es decir. que cada vez que corta se utiliza para algo, es ascendido a int.