2010-02-23 18 views
5

alcuni mesi fa ho scritto questo codice perché era l'unico modo in cui potevo pensare di farlo (mentre imparavo C#), beh. Come lo faresti? unchecked è il modo corretto di farlo?Come fare senza deselezionare?

unchecked //FromArgb takes a 32 bit value, though says it's signed. Which colors shouldn't be. 
{ 
    _EditControl.BackColor = System.Drawing.Color.FromArgb((int)0xFFCCCCCC); 
} 
+0

Penso che si possa dividere il valore in Color.FromArgb (0xFF, 0xCC, 0xCC, 0xCC); Questo dovrebbe funzionare senza errori di cast. – Beku

+0

So che questa è una vecchia domanda, ma l'ho appena incontrata, e sono curioso di sapere perché non vuoi usare semplicemente 'deselezionata '. Era una domanda di curiosità o c'era un problema reale? Avrei appena usato deselezionato. –

+0

@Jon al momento mi considererei un juniores al C#. Quindi mi chiedevo se "non controllato" fosse sbagliato. Ora, probabilmente rimarrò con 'unchecked', invece della risposta marcata. – Earlz

risposta

2

Si potrebbe abbattere le componenti del int e utilizzare il FromArgb() overload che li porta a parte:

System.Drawing.Color.FromArgb(0xFF, 0xCC, 0xCC, 0xCC); 
6

ci vuole un int firmato b/c questo risale al tempo in cui VB.NET non ha avuto valori senza segno. Quindi, al fine di mantenere la compatibilità tra C# e VB.NET, tutte le librerie BCL utilizzano valori firmati, anche se non ha senso logico.

+1

+1 per approfondimenti storici. –

+2

Un altro modo per osservare questo è che le lingue compatibili con CLS non sono richieste per comprendere uint. Quindi le biblioteche generalmente evitano uint. –

+1

Altre classi (come 'System.Net.IPAddress') hanno deciso di utilizzare il più grande tipo con firma a 64 bit in modo che le persone potessero passare più facilmente in un valore senza segno a 32 bit per aggirare questo problema. –

0

metodi di estensione può nascondere questo:

public static Color ToColor(this uint argb) 
{ 
    return Color.FromArgb(unchecked((int)argb)); 
} 

public static Color ToColor(this int argb) 
{ 
    return Color.FromArgb(argb); 
} 

Usage:

0xff112233.ToColor(); 
0x7f112233.ToColor(); 

Sembra che dovrebbero essere un'altra notazione (come 0v12345678) o qualche altro modo per aggirare questo problema.

Problemi correlati