2010-02-23 11 views
5

hace unos meses escribí este código porque era la única forma en que podía pensar hacerlo (mientras aprendía C#), bueno. ¿Como lo harias? ¿Es unchecked la forma correcta de hacer esto?¿Cómo hacer esto sin desmarcar?

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

Creo que puede dividir el valor en Color.FromArgb (0xFF, 0xCC, 0xCC, 0xCC); Esto debería funcionar sin errores de lanzamiento. – Beku

+0

Sé que esta es una vieja pregunta, pero acabo de enterarme, y tengo curiosidad sobre por qué no querrías simplemente usar 'sin marcar'. ¿Fue una pregunta curiosa, o hubo un problema real? Me gustaría haber usado sin marcar. –

+0

@Jon en ese momento me consideraría un junior en C#. Entonces me preguntaba si 'sin marcar' era malo. Ahora, probablemente me quedo con 'sin marcar' aunque en lugar de la respuesta marcada. – Earlz

Respuesta

2

Se podría romper los componentes de la int y utilizar la sobrecarga de FromArgb() que los lleva por separado:

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

Toma un int b/c con esta fecha desde el momento en que VB.NET no tenía valores sin signo. Por lo tanto, para mantener la compatibilidad entre C# y VB.NET, todas las bibliotecas BCL utilizan valores firmados, incluso si no tiene sentido lógico.

+1

+1 para una visión histórica. –

+2

Otra forma de ver esto es que los lenguajes compatibles con CLS no son necesarios para comprender uint. Entonces las bibliotecas generalmente evitan uint. –

+1

Otras clases (como 'System.Net.IPAddress') decidieron usar el tipo de 64 bits firmado más grande para que las personas pudieran pasar más fácilmente un valor completo de 32 bits sin firmar para evitar este problema. –

0

métodos de extensión pueden ocultar este:

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

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

Uso:

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

Parece que deberían ser otra notación (como 0v12345678) o alguna otra forma de evitar este problema.

Cuestiones relacionadas