Ormai sono passate quasi due settimane da quando vi ho proposto questo test:
"Pensate a dichiarare e inizializzare x e y in modo da avere:
x += y; // un'assegnazione corretta
x = x + y; // errore di compilazione"
e aggiungevo che "apprezzerò nei vostri feedback le spiegazioni migliori". Alla fine, siete ri-entrati tutti (dalle vacanze) ma solo due di voi sono ri-usciti :-) a mandarmi feedback validi.
Il primo è stato lo Schumacher dei miei test, Flavio Polesello:
"Per generare un errore di compilazione sull'assegnazione x = x + y è sufficiente dichiarare le variabili x e y di 1 o di 2 byte (sbyte, short, byte, ushort e char).
Un esempio è il seguente:
public static void Main()
{
byte x = 0;
byte y = 0;
x += y; // un'assegnazione corretta
x = x + y; // errore di compilazione
}
Il CLR esegue le operazioni aritmetiche solo su 32 bit e 64 bit. Se si devono sommare due variabili di 8 bit o 16 bit (1 o 2 byte), queste vengono convertite implicitamente a 32 bit, vengono sommate e infine viene restituito un valore ancora a 32 bit. L'errore di compilazione è dato dal fatto che il valore di ritorno deve essere riconvertito esplicitamente.
Nell'esempio di prima, questa assegnazione sarebbe valida:
x = (byte)(x + y);
A differenza dell'operatore +, nell'operatore += la conversione viene fatta implicitamente e quindi non ci sono errori di compilazione."
Il secondo è stato Marco Poponi. Qui la sua spiegazione:
char x = 'x';
char y = 'y';
//ok: non c'è bisogno di conversione esplicita, visto che x viene aumentato.
x += y;
//errore: c'è bisogno di una conversione esplicita per x + y
x = x + y;
Una volta compilato (con una explicit conversion) quello che fa è lo stesso: prima inizializza con due i4, somma, poi converte in u2, poi riassegna.
Complimenti a tutti e due!
Ah, dimenticavo... mi ha mandato anche Richter la sua spiegazione: la trovate qui, alla pagina 131 :-)
Oggi ho fatto 6 mesi da quando bloggo... Mi è venuto in mente il gigante quaderno rosso in cui bloggavo a casa, sulla carta (!), un sacco di cose di matematica. Ho riempito lì circa 700 pagine in una decina di anni a partire dall'89; si chiamava quel quaderno, proprio così con maiuscole, "N-AM TIMP", cioè "NON HO TEMPO". Mi manca parecchio il suo odore, il suo tocco, peccato che non l'ho portato qui con me.