2009-05-29 10 views
15

Ich muss folgenden Code in VS2008 .net 3.5 mit WinForms:Warum wird für die Byte-Subtraktion in C# eine Umwandlung benötigt?

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); 

Als ich verlassen die „(byte)“ von der letzten Zeile des Codes, ich einen Compiler-Fehler sagen, es „kann nicht implizit Typ umwandeln 'int' bis 'byte'. " Wenn alles vom Typ ist byte und byte ist ein Integer-Typ ... dann, warum muss ich die Besetzung haben?

+6

Eric Lippert sagt: "Ich denke nicht an Bytes als" Zahlen "; ich denke an sie als Muster von Bits, die als Zahlen, oder Zeichen oder Farben _interpretiert werden könnten. Wenn Sie sein werden Wenn man sie mathematisch anwendet und sie als Zahlen behandelt, dann macht es Sinn, das Ergebnis in einen Datentyp zu verschieben, der häufiger als Zahl interpretiert wird. " Siehe http://stackoverflow.com/questions/941584/byte-byte-int-why-c. – Brian

+5

Ihr habt bemerkt, dass ihr dies als Duplikat markiert habt, obwohl es * vor * dem Link "hat schon eine Antwort hier" gefragt wurde? –

+0

Hölle, jetzt sagt es sogar "vorher gefragt", obwohl die andere Frage drei Jahre später gestellt wurde. –

Antwort

15

Da Subtraktion bis zu einer Ganzzahl erzwingt. Wie ich mich erinnere, ist Byte in C# ein vorzeichenloser Typ, so dass die Subtraktion Sie aus der Domäne der Bytes herausnehmen kann.

+1

Subtraktion kann Sie aus der Domäne jedes Nummerntyps entfernen. Das erklärt nicht wirklich, warum es keinen byte-spezifischen Subtraktionsoperator gibt. –

+0

Nun, dann lautet die Antwort "weil die Entwickler von C# beschlossen haben, dass sie keins wollen." –

2

Dies ist, weil byte Subtraktion eine int zurückgibt. Tatsächlich werden alle binären arithmetischen Operationen auf bytes eine int zurückgeben, so dass die Besetzung erforderlich ist.

+0

Ich denke, das ist Subtraktion, eigentlich .... –

+0

Ups - danke Charlie, ich habe es korrigiert. –

+0

Gibt es einen Grund für den Downvote? –

4

Da arithmetische Operationen in Bytes standardmäßig ganze Zahlen zurückliefern, wird der engere Typ von Null (Byte) zu int (also zu oColor.r - Prozent) hochgestuft. Daher ist der Typ der Operation ein int. Der Compiler ermöglicht es Ihnen nicht, ohne einen Cast einen breiteren Typ einem schmaleren Typ zuzuordnen, da dies eine verlustreiche Operation ist. Daher erhalten Sie den Fehler, es sei denn, Sie sagen explizit "Ich weiß, dass ich einige Daten verliere, es ist in Ordnung" mit der Besetzung.

10

Das ist, weil das Ergebnis einer Byte Subtraktion nicht in einem Byte passt:

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

Was für eine schöne grafische Erklärung !!! –

+17

Kein Integer-Typ außer Floats oder Dezimalzahlen. int ist ebenfalls endlicher Bereich, also passt (min_int - max_int) nicht, aber es gibt einen int zurück. –

+2

@Adam: 1) Floats und Dezimalzahlen sind keine Integer-Typen. 2) Ergebnisse von Subtraktionen für diese können auch nicht passen, da diese auch einen endlichen (wenn auch großen) Bereich haben. – Brian

1

Da der arithmetische Ausdruck auf der rechten Seite des Zuweisungsoperators standardmäßig int auswertet. In Ihrem Beispiel lautet percent standardmäßig int. Sie können mehr darüber auf der MSDN page lesen.

2

Da arithmetische Operationen in sbyte, byte, ushort und short automatisch in int konvertiert werden. Der plausibelste Grund dafür ist, dass solche Operationen wahrscheinlich überlaufen oder unterlaufen werden.

In Ihrer ternären Operation ergibt das finale oColor.R - Prozent also tatsächlich ein int, kein Byte. Daher ist der Rückgabetyp der Operation int.

0

FWIW, Java fördert auch Bytes zu int.

1

Versuchen Sie, diesen C# -Code auszuführen: Objekt o = (Byte) (1); o = (int) o; Was erwarten Sie? Jetzt versuchen :)

Ich denke, das ist richtig:

Eric Lippert sagt: „Ich glaube nicht, von Bytes als‚Zahlen‘, ich glaube, von ihnen als Muster von Bits, die sein könnte interpretiert als Zahlen, oder Zeichen, oder Farben oder was auch immer. Wenn Sie Mathe auf ihnen tun und sie als Zahlen behandeln, dann ist es sinnvoll, das Ergebnis in einen Datentyp zu verschieben, der häufiger als Zahl interpretiert wird. "

Vielleicht ist Byte näher verkohlen als zu int.