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 ...

¿Fue útil?

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 o ulong,   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 escribir ulong, 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top