Unary minus auf einem kurzen wird ein int?

8

Im Folgenden:

%Vor%

Der Compiler gibt mir den Fehler:

  

Fehler 21 Kann den Typ 'int' nicht implizit in 'short' konvertieren. Es gibt eine explizite Konvertierung (fehlt eine Besetzung?)

Ich muss den Code ändern, damit es funktioniert:

%Vor%

Es ist, als würde der Compiler etwas wie (int) 0 - p.d.ID.Value oder Int16.operator - gibt Int32s ...?

    
rabidpebble 13.01.2010, 16:08
quelle

2 Antworten

13

Ich verweise auf Abschnitt 7.6.2 der Spezifikation, der besagt:

Bei einer Operation der Form -x wird die Überladungsauflösung des unären Operators angewendet, um eine bestimmte Operatorimplementierung auszuwählen. Der Operand wird in den Parametertyp des ausgewählten Operators konvertiert, und der Typ des Ergebnisses ist der Rückgabetyp des Operators. Die vordefinierten Negationsoperatoren sind:

Ganzzahlige Negation:

%Vor%

Das Ergebnis wird berechnet, indem x von Null subtrahiert wird. Wenn der Wert von x der kleinste darstellbare Wert des Operandentyps ist (-2 ^ 31 für int oder -2 ^ 63 für long), dann ist die mathematische Negation von x innerhalb des Operandentyps nicht darstellbar. Wenn dies in einem überprüften Kontext auftritt, wird eine System.OverflowException ausgelöst. Wenn es in einem ungeprüften Kontext auftritt, ist das Ergebnis der Wert des Operanden und der Überlauf wird nicht gemeldet. Wenn der Operand des Negationsoperators vom Typ Uint ist, wird er in long konvertiert, und der Typ des Ergebnisses ist lang. Eine Ausnahme ist die Regel, die es erlaubt, den int-Wert -2147483648 (-2 ^ 31) als dezimales Integer-Literal zu schreiben.

Wenn der Operand des Negationsoperators vom Typ ulong ist, tritt ein Fehler bei der Kompilierung auf. Eine Ausnahme ist die Regel, die es erlaubt, den langen Wert -9223372036854775808 (-2 ^ 63) als dezimales Integer-Literal zu schreiben.

Gleitkomma-Negation:

%Vor%

Das Ergebnis ist der Wert von x mit invertiertem Vorzeichen. Wenn x NaN ist, ist das Ergebnis auch NaN.

Dezimale Negation:

%Vor%

Das Ergebnis wird berechnet, indem x von Null subtrahiert wird. Dezimale Negation entspricht der Verwendung des unären Minus-Operators vom Typ System.Decimal.

Wie Sie sehen können, gibt es keinen eindeutigen Minus-Operator, der für Kurzschlüsse definiert ist. Die Überladungsauflösung wählt die Eins für Ints aus, da diese die beste Übereinstimmung aller verfügbaren unären Minusoperatoren darstellt.

    
Eric Lippert 13.01.2010, 16:16
quelle
2

Es gibt keinen unären Minus-Operator, der einen kurzen Wert annimmt. Stattdessen wählt die Überladungsauflösung die int-Version des unären Minus-Operators und führt eine implizite Konvertierung durch.

    
Jeffrey L Whitledge 13.01.2010 16:17
quelle

Tags und Links