Numero intero sum di blu, breve + = breve problema

Programma in 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); 

Ci sono due domande qui. Il primo è “perché è il breve e il più breve risultato in int?”

Bene, supponiamo che breve e più corto sia breve e vediamo cosa succede:

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

E la media è, naturalmente, -9845 se questo calcolo viene eseguito in cortometraggi. La sum è maggiore del più breve ansible, quindi si estende al negativo e quindi si divide il numero negativo.

In un mondo in cui l’aritmetica intera si avvolge attorno a esso è molto più sensato fare tutti i calcoli in int, un tipo che è probabile che abbia un intervallo sufficiente per i calcoli tipici da non traboccare.

La seconda domanda è:

  • breve più corto è int
  • l’assegnazione di int a short è illegale
  • a + = b è uguale a a = a + b
  • pertanto short + = short dovrebbe essere illegale
  • quindi perché è legale?

La domanda ha una premessa errata; la terza riga sopra è sbagliata. Gli stati della specifica C # nella sezione 7.17.2

Altrimenti, se l’operatore selezionato è un operatore predefinito, se il tipo di reso dell’operatore selezionato è esplicitamente convertibile al tipo di x, e se y è implicitamente convertibile al tipo di x o l’operatore è un operatore di turno, allora l’operazione viene valutato come x = (T) (x op y), dove T è il tipo di x, tranne che x viene valutato solo una volta.

Il compilatore inserisce il cast per tuo conto. Il ragionamento corretto è:

  • breve più corto è int
  • l’assegnazione di int a short è illegale
  • s1 + = s2 è uguale a s1 = (breve) (s1 + s2)
  • quindi questo dovrebbe essere legale

Se non è stato inserito il cast per te, sarebbe imansible utilizzare l’assegnazione composta su molti tipi.

Bene, l’operatore += dice che aumenterai il valore di a con un breve, mentre = indica che sovrascrivi il valore, con il risultato di un’operazione. L’operazione a + b produce un int, non sapendo che può fare altrimenti, e stai cercando di assegnare quella int a un breve.

Devi usare:

 a = (short)(a + b); 

Per quanto riguarda la differenza tra i comportamenti di assegnazione e assegnazione, immagino che abbia qualcosa a che fare con questo (da 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). 

Tuttavia, è un po ‘vago, quindi qualcuno mabye con una comprensione più profonda può commentare.

Ciò accade perché int è il più piccolo tipo firmato per cui è definito + . Qualunque cosa più piccola viene prima promossa a int. L’operatore += è definito rispetto a + , ma con una regola del caso speciale per la gestione dei risultati che non si adattano al target.

Questo perché + = è implementato come una funzione sovraccaricata (una delle quali è un breve, e il compilatore sceglie il sovraccarico più specifico). Per l’espressione (a + b), il compilatore allarga il risultato a un int di default prima di assegnarlo.