tipo puede operandos operador objeto implícitamente error cs0029 convertir aplicar c# int short

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í:

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 .



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.



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;