2009-05-29 9 views
15

devo seguente codice in VS2008 NET 3.5 utilizzando WinForms:Perché è richiesto un cast per la sottrazione di byte in C#?

byte percent = 70; 
byte zero = 0; 

Bitmap copy = (Bitmap)image1.Clone(); 
... 

Color oColor = copy.GetPixel(x, y); 
byte oR = (byte)(oColor.R - percent < zero ? zero : oColor.R - percent); 

Quando lascio il "(byte)" off l'ultima riga di codice, ottengo un errore di compilazione dicendo che "Non può convertire implicitamente il tipo 'int' a 'byte'. " Se tutto è di tipo byte e byte è un tipo intero ... allora perché devo avere il cast?

+6

Eric Lippert dice "Non penso ai byte come ai" numeri ", li considero come modelli di bit che possono essere interpretati come numeri, caratteri, colori o qualsiasi altra cosa. facendo matematica su di loro e trattandoli come numeri, allora ha senso spostare il risultato in un tipo di dati che viene più comunemente interpretato come un numero. " Vedi http://stackoverflow.com/questions/941584/byte-byte-int-why-c. – Brian

+5

Ragazzi, vi rendete conto che avete contrassegnato questo come un duplicato anche se è stato chiesto * prima * il link "ha già una risposta qui"? –

+0

Inferno, ora dice anche "chiesto prima" anche se l'altra domanda è stata posta tre anni dopo. –

risposta

15

Poiché la sottrazione è forzata fino a un numero intero. Come ricordo, il byte è un tipo senza segno in C#, quindi la sottrazione può portarti fuori dal dominio dei byte.

+1

La sottrazione può portarti fuori dal dominio di ogni tipo di numero. Questo in realtà non spiega il motivo per cui non esiste un operatore di sottrazione specifico per byte. –

+0

Bene, allora, la risposta è "perché gli sviluppatori di C# hanno deciso che non ne volevano uno". –

2

Questo perché la sottrazione byte restituisce un valore int. In realtà qualsiasi operazione di aritmetica binaria su bytes restituirà un int, quindi è necessaria la trasmissione.

+0

Penso che sia sottrazione, in realtà .... –

+0

Oops - grazie Charlie, l'ho corretto. –

+0

C'è una ragione per il downvote? –

9

Arithmetic on bytes restituisce un valore int per impostazione predefinita.

+0

Link is dead ... –

4

Poiché l'aritmetica sui byte restituisce gli interi per impostazione predefinita, così delle due assegnazioni possibili il tipo più ristretto di zero (byte) viene promosso a int (quello di oColor.r-percento). Quindi il tipo dell'operazione è un int. Il compilatore non consentirà, senza un cast, di assegnare un tipo più ampio a un tipo più ristretto, perché è un'operazione con perdite. Quindi ottieni l'errore, a meno che tu non dica esplicitamente "So che sto perdendo dei dati, va bene" con il cast.

10

Questo perché il risultato di una sottrazione di byte non rientra in un byte:

byte - byte = (0..255) - (0..255) = -255..255 
+1

Che bella spiegazione grafica !!! –

+17

Né alcun tipo intero tranne float o decimali. int ha anche un intervallo finito, quindi (min_int - max_int) non si adatta, ma restituisce un int. –

+2

@Adam: 1) float e decimali non sono tipi interi. 2) I risultati delle sottrazioni anche per questi potrebbero non essere adatti, in quanto hanno anche una gamma finita (anche se ampia). – Brian

1

Poiché l'espressione aritmetica sul lato destro l'operatore di assegnazione restituisce int per impostazione predefinita. Nell'esempio percent predefinito su int. Puoi leggere ulteriori informazioni al riguardo su MSDN page.

2

Poiché le operazioni aritmetiche su sbyte, byte, ushort e short vengono convertite automaticamente in int. Il motivo più plausibile per questo è che tali operazioni possano traboccare o traboccare.

Quindi, nella vostra operazione ternaria, il colore o.Color.R. finale, in realtà risulta in un int, non in un byte. Quindi il tipo di ritorno dell'operazione è int.

0

FWIW, java promuove anche i byte per int.

1

Prova a eseguire questo codice C#: oggetto o = (byte) (1); o = (int) o; Cosa ti aspetti? Ora provate :)

Penso che questo sia giusto:

Eric Lippert dice: "Non credo di byte come 'numeri'; penso a loro come modelli di bit che potrebbero essere interpretati come numeri, o caratteri, o colori o qualsiasi altra cosa: se hai intenzione di fare matematica su di loro e li tratta come numeri, allora ha senso spostare il risultato in un tipo di dati che viene interpretato più comunemente come un numero. "

Forse byte è più vicino a char che a int.

Problemi correlati