2009-05-29 28 views
15

tengo que siguiente código en VS2008 .NET 3.5 utilizando Windows Forms:¿Por qué se requiere un molde para la resta de bytes en 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); 

Cuando salgo del "(byte)" fuera de la última línea de código, me sale un error de compilación diciendo que "No se puede convertir implícitamente el tipo 'int' a 'byte'. " Si todo es de tipo byte y byte es un tipo entero ... entonces ¿por qué necesito tener el molde?

+6

Eric Lippert dice: "No considero los bytes como" números "; los considero como patrones de bits que podrían interpretarse_ como números, o caracteres, o colores o lo que sea. haciendo matemática sobre ellos y tratándolos como números, entonces tiene sentido mover el resultado a un tipo de datos que se interpreta más comúnmente como un número ". Ver http://stackoverflow.com/questions/941584/byte-byte-int-why-c. – Brian

+5

Ustedes se dan cuenta que marcó esto como un duplicado, aunque se les preguntó * antes * el enlace "ya tiene una respuesta aquí". –

+0

Demonios, ahora incluso dice "preguntado antes" aunque la otra pregunta fue hecha tres años después. –

Respuesta

15

Porque la sustracción está forzando hasta un número entero. Como recuerdo, byte es un tipo sin signo en C#, por lo que la resta puede sacarte del dominio de bytes.

+1

Resta puede sacarte del dominio de cada tipo de número. Eso realmente no explica por qué no hay un operador de resta específico de bytes. –

+0

Bueno, entonces, la respuesta es "porque los desarrolladores de C# decidieron que no querían uno". –

2

Esto es porque byte resta devuelve int. En realidad, cualquier operación aritmética binaria en bytes devolverá un int, por lo que se requiere el lanzamiento.

+0

Creo que eso es una resta, en realidad ... –

+0

Vaya, gracias Charlie, lo corrigí. –

+0

¿Hay alguna razón para el voto a favor? –

9

Arithmetic on bytes da como resultado un valor int por defecto.

+0

El enlace está muerto ... –

4

Debido a la aritmética de enteros bytes devuelve de forma predeterminada para una de las dos posibles asignaciones del tipo más estrecha de (byte) es ascendido a cero int (el de oColor.r - ciento). Por lo tanto, el tipo de operación es un int. El compilador no permitirá, sin un molde, asignar un tipo más ancho a uno más angosto, porque es una operación con pérdida. De ahí que obtenga el error, a menos que diga explícitamente "Sé que estoy perdiendo algunos datos, está bien" con el elenco.

10

Eso es debido a que el resultado de una resta de bytes no cabe en un byte:

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

¡Qué buena explicación gráfica! –

+17

Tampoco hay ningún tipo de entero excepto flotantes o decimales. int también es de rango finito, por lo que (min_int - max_int) no encajará, pero devuelve un int. –

+2

@Adam: 1) los flotantes y decimales no son tipos enteros. 2) Los resultados de restas para estos también pueden no ajustarse, ya que estos también tienen un rango finito (aunque grande). – Brian

1

Debido a que la expresión aritmética en el lado derecho del operador de asignación se evalúa como int por defecto. En su ejemplo percent se establece de manera predeterminada en int. Puede leer más sobre esto en el MSDN page.

2

Porque las operaciones aritméticas en sbyte, byte, ushort y short se convierten automáticamente en int. La razón más plausible para esto es que es probable que dichas operaciones se desborden o subdesborden.

Por lo tanto, en su operación ternaria, el oColor.R final, en realidad, da como resultado un int, no un byte. Entonces, el tipo de retorno de la operación es int.

0

FWIW, java también promueve bytes a int.

1

Intente ejecutar este código C#: objeto o = (byte) (1); o = (int) o; ¿Qué esperas? Ahora intenta :)

Creo que esto es correcto:

Eric Lippert dice: "Yo no pienso en bytes como 'números'; pienso en ellos como patrones de bits que pueden ser interpretados como números, o caracteres, o colores o lo que sea. Si va a hacer cálculos matemáticos y tratarlos como números, tiene sentido mover el resultado a un tipo de datos que se interpreta más comúnmente como un número. "

Quizás byte esté más cerca de char que de int.

Cuestiones relacionadas