c# - operandos - No se puede convertir implícitamente el tipo ''int'' en ''short''
no se puede convertir de string a int c# (9)
Agregar dos valores Int16
resulta en un valor Int32
. Tendrás que Int16
a Int16
:
Int16 answer = (Int16) (firstNo + secondNo);
Puede evitar este problema cambiando todos sus números a Int32
.
Esta pregunta ya tiene una respuesta aquí:
- Entero sumando blues, short + = short problem 5 respuestas
Escribí el siguiente pequeño programa para imprimir la secuencia de Fibonacci:
static void Main(string[] args)
{
Console.Write("Please give a value for n:");
Int16 n = Int16.Parse(Console.ReadLine());
Int16 firstNo = 0;
Int16 secondNo = 1;
Console.WriteLine(firstNo);
Console.WriteLine(secondNo);
for (Int16 i = 0; i < n; i++)
{
//Problem on this line
Int16 answer = firstNo + secondNo;
Console.WriteLine(answer);
firstNo = secondNo;
secondNo = answer;
}
Console.ReadLine();
}
El mensaje de compilación es:
No se puede convertir implícitamente el tipo ''int'' en ''corto''. Existe una conversión explícita (¿falta un elenco?)
Como todo lo que implica es un Int16 (corto), ¿por qué hay conversiones implícitas? Y más específicamente, ¿por qué falla aquí (y no cuando inicialmente se asigna un int a la variable)?
Una explicación sería muy apreciada.
El operador más convierte operandos a int primero y luego realiza la suma. Entonces el resultado es el int. Debe volver a utilizar el término explícitamente porque las conversiones de tipo "más largo" a "más corto" escriben explícitamente, de modo que no pierda datos accidentalmente con un lanzamiento implícito.
En cuanto a por qué int16 se convierte a int, la respuesta es, porque esto es lo que se define en la especificación de C # . Y C # es de esta manera porque fue diseñado para coincidir estrechamente con la forma en que funciona CLR, y CLR solo tiene una aritmética de 32/64 bits y no de 16 bits. Otros idiomas encima de CLR pueden elegir exponer esto de manera diferente.
El problema es que agregar dos resultados Int16
en un Int32
como otros ya han señalado.
Su segunda pregunta, por qué este problema no ocurre ya en la declaración de esas dos variables se explica aquí: http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=VS.71%29.aspx :
short x = 32767;
En la declaración anterior, el entero literal 32767 se convierte implícitamente de int a corto. Si el literal entero no cabe en una ubicación de almacenamiento corta, se producirá un error de compilación.
Por lo tanto, la razón por la que funciona en su declaración es simplemente que los literales proporcionados se ajustan a un short
.
El resultado de sumar dos variables Int16
es un Int32
:
Int16 i1 = 1;
Int16 i2 = 2;
var result = i1 + i2;
Console.WriteLine(result.GetType().Name);
Da salida a Int32
.
Eso es porque el resultado de agregar dos Int16
es un Int32
. Consulte el párrafo "conversiones" aquí: http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=vs.71%29.aspx
La línea
Int16 answer = firstNo + secondNo;
se interpreta como
Int16 answer = (Int32) (firstNo + secondNo);
Simplemente porque no existe la aritmética Int16.
La solución simple: No use Int16 . Use Int32 o simplemente int
.
int
es tu tipo de entero por defecto. corto y largo solo se usan en casos especiales.
Lea las respuestas de Eric Lippert a estas preguntas
Microsoft convierte sus variables Int16
en Int32
al hacer la función de agregar.
Cambiar lo siguiente:
Int16 answer = firstNo + secondNo;
dentro...
Int16 answer = (Int16)(firstNo + secondNo);
Por alguna extraña razón, puede usar el operador + = para agregar cortos.
short answer = 0;
short firstNo = 1;
short secondNo = 2;
answer += firstNo;
answer += secondNo;