2010-11-08 21 views
10

Ricevo l'errore "Impossibile convertire in modo implicito il tipo 'int' in 'byte'. Esiste una conversione esplicita (ti manca un cast?)". Non byte + byte = byte? Inoltre ho notato quando rimuovo il +rgb.Green funzionaCosa c'è di sbagliato in questa espressione? Impossibile convertire implicitamente il tipo 'int' in 'byte'

// rgb.Red, rgb.Green, rgb.Blue are byte types 
// h, delta are double 
rgb.Red = Convert.ToByte(Math.Round((h - 4) * delta)) + rgb.Green; 

public struct RGBColor 
{ 
    public byte Red { get; set; } 
    public byte Green { get; set; } 
    public byte Blue { get; set; } 
} 
+0

Qual è RGB, penso che sia oggetto di classe Color cioè il motivo per cui non funziona .... –

+0

@Javed Akram, 'rgb' è un' struct' come indicato nell'aggiornamento –

+0

ohh, OK le risposte date dagli esperti sono all'altezza del marchio. –

risposta

12

Non byte + byte = byte?

No, perché può traboccare (> 255), ecco perché questa operazione restituisce un Int32. Puoi restituire il risultato a byte a tuo rischio.

+1

+1 per "a proprio rischio" – mskfisher

+1

Non è una buona ragione, anche Int64 + Int64 può traboccare. Deve essere stato applicato un certo pragmatismo. –

+1

+1 @HenkHolterman Sono d'accordo, è interamente dovuto al fatto che non ci sono operatori + su byte apparentemente dovuti a motivi di prestazioni (aritmetica a 8 bit su processori a 32 o 64 bit non efficienti). Da qui la conversione implicita in int. Nulla a che vedere con "proteggerci" dal rischio di overflow in realtà. –

16

aggiunta di due byte produce un numero intero in C#. Converti l'intero elemento in un byte.

rgb.Red = (byte)(Convert.ToByte(Math.Round((h - 4) * delta)) + rgb.Green); 

Vedere byte + byte = int... why? per ulteriori informazioni.

+0

+1: interessante, non lo sapevo ... concesso, non riesco a pensare a nessun codice Ho scritto in C# che aggiunge due byte insieme. – Powerlord

6

http://msdn.microsoft.com/en-us/library/5bdb6693(VS.71).aspx

byte + byte = int

Più precisamente quadro non definisce operatore + su byte, ma c'è una conversione implicita da byte a int, a

byte + byte = int + int = int

Non sono del tutto d'accordo con la giustificazione di questo dato che potrebbe traboccare, poiché potrebbe int + int. Ma ovviamente l'aritmetica dei byte è molto più "pericolosa" in questo senso - e questo comportamento ti costringe a dare un'occhiata da vicino a ciò che stai facendo.

+1

+1 per referenziare la documentazione – Les

0

Per incorporati tipi numerici, una conversione implicita può essere fatta quando il valore da memorizzare può adattarsi nella variabile senza essere troncato o arrotondata. Ad esempio, una variabile di tipo long (integer a 8 byte) può memorizzare qualsiasi valore memorizzato da un int (4 byte su un computer a 32 bit).

consultare implicito sezione di conversione in questo https://msdn.microsoft.com/en-us/library/ms173105.aspx

Ora venendo al tuo esempio, ovviamente byte + byte non deve necessariamente essere un byte. Quindi byte + byte potrebbe essere int. In tal caso, "Conversione implicita" non si adatta perché Il lancio verso l'alto è possibile non viceversa, ovvero int può essere convertito in long, byte può essere convertito in int.

Quindi nel tuo caso hai bisogno di conversione esplicita. Il compilatore ha bisogno di te per eseguire questo.

Tuttavia, se una conversione non può essere fatta senza il rischio di perdere informazioni, il compilatore richiede che si esegue un conversione esplicita, che si chiama un cast. Un cast è un modo per informare esplicitamente il compilatore che si intende effettuare la conversione e che si è consapevoli che potrebbe verificarsi una perdita di dati.

Consultare conversione esplicita nella stessa pagina.

così per il tuo esempio

rgb.Red = (byte)(Convert.ToByte(Math.Round((h - 4) * delta)) + rgb.Green); 

Questo permette di convertire int a byte in modo esplicito.

Problemi correlati