remarks cref c# types int short

cref - remarks c#



Entero sumando azules, corto+= problema corto (5)

Bueno, el operador += dice que aumentará el valor de a con un corto, mientras que = dice que sobrescribirá el valor, con el resultado de una operación. La operación a + b produce un int, sin saber que puede hacer otra cosa, y estás tratando de asignar ese int a un corto.

Programa en C #:

short a, b; a = 10; b = 10; a = a + b; // Error : Cannot implicitly convert type ''int'' to ''short''. // we can also write this code by using Arithmetic Assignment Operator as given below a += b; // But this is running successfully, why? Console.Write(a);


Esto se debe a que + = se implementa como una función sobrecargada (una de las cuales es breve, y el compilador elige la sobrecarga más específica). Para la expresión (a + b), el compilador amplía el resultado a un int por defecto antes de asignarlo.


Esto sucede porque int es el tipo más pequeño con signo para el que + está definido. Cualquier cosa más pequeña se promueve primero a int. El operador += se define con respecto a + , pero con una regla de caso especial para manejar resultados que no se ajustan al objetivo.


Hay dos preguntas aquí. El primero es "¿por qué es corto más un resultado corto en int?"

Bueno, supongamos que corto más corto fue corto y vemos lo que sucede:

short[] prices = { 10000, 15000, 11000 }; short average = (prices[0] + prices[1] + prices[2]) / 3;

Y el promedio es, por supuesto, -9845 si este cálculo se realiza en cortocircuitos. La suma es mayor que el short más grande posible, por lo que se ajusta a negativo, y luego se divide el número negativo.

En un mundo en el que la aritmética de enteros se ajusta, es mucho más sensato hacer todos los cálculos en int, un tipo que probablemente tenga suficiente alcance para que los cálculos típicos no se desborden.

La segunda pregunta es:

  • corto más corto es int
  • asignar int a corto es ilegal
  • a + = b es lo mismo que a = a + b
  • por lo tanto corto + = corto debe ser ilegal
  • Entonces, ¿por qué es esto legal?

La pregunta tiene una premisa incorrecta; la tercera línea de arriba está mal. La especificación C # establece en la sección 7.17.2

De lo contrario, si el operador seleccionado es un operador predefinido, si el tipo de devolución del operador seleccionado es explícitamente convertible al tipo de x, y si y es implícitamente convertible al tipo de x o el operador es un operador de desplazamiento, entonces la operación se evalúa como x = (T) (x op y), donde T es el tipo de x, excepto que x se evalúa solo una vez.

El compilador inserta el yeso en tu nombre. El razonamiento correcto es:

  • corto más corto es int
  • asignar int a corto es ilegal
  • s1 + = s2 es lo mismo que s1 = (corto) (s1 + s2)
  • por lo tanto esto debería ser legal

Si no inserta el modelo por usted, entonces sería imposible usar la asignación compuesta en muchos tipos.


Tienes que usar:

a = (short)(a + b);

En cuanto a la diferencia entre los comportamientos de asignación y asignación de suma, me imagino que tiene algo que ver con esto (de msdn)

x+=y is equivalent to x = x + y except that x is only evaluated once. The meaning of the + operator is dependent on the types of x and y (addition for numeric operands, concatenation for string operands, and so forth).

Sin embargo, es un poco vago, por lo que mabye alguien con un entendimiento más profundo puede comentar.