2010-01-13 9 views
8

En el siguiente:¿Unario menos en un corto se convierte en int?

public class p 
{ 
    short? mID; 
    short? dID; 
} 

short id = p.mID ?? -p.dID.Value; 

El compilador me da el error:

Error 21 Cannot implicitly convert type 'int' to 'short'. An explicit conversion exists (are you missing a cast?)

tengo que cambiar el código a la siguiente para que funcione:

short id = p.mID ?? (short)-p.dID.Value; 

Es tan si el compilador está haciendo algo como (int) 0 - p.dID.Value, o ese Int16.operator - está devolviendo Int32s ...?

Respuesta

13

remito a la sección 7.6.2 de la especificación, que establece:


Para una operación de la forma -x, se aplica unario resolución de sobrecarga del operador para seleccionar una aplicación específica del operador. El operando se convierte al tipo de parámetro del operador seleccionado, y el tipo de resultado es el tipo de retorno del operador. Los operadores de negación predefinidos son: negación

Entero:

int operator –(int x); 
long operator –(long x); 

El resultado se calcula restando x de cero. Si el valor de x es el valor representable más pequeño del tipo de operando (-2^31 para int o -2^63 para long), entonces la negación matemática de x no es representable dentro del tipo de operando. Si esto ocurre dentro de un contexto verificado, se lanza una System.OverflowException; si ocurre dentro de un contexto no verificado, el resultado es el valor del operando y el desbordamiento no se informa. Si el operando del operador de negación es de tipo uint, se convierte en tipo largo y el tipo de resultado es largo. Una excepción es la regla que permite que el valor int -2147483648 (-2^31) se escriba como un literal de entero decimal.

Si el operando del operador de negación es de tipo ulong, se produce un error en tiempo de compilación. Una excepción es la regla que permite escribir el valor largo -9223372036854775808 (-2^63) como un entero decimal.

de punto flotante negación:

float operator –(float x); 
double operator –(double x); 

El resultado es el valor de x con su signo invertido. Si x es NaN, el resultado también es NaN.

negación decimal:

decimal operator –(decimal x); 

El resultado se calcula restando x de cero. La negación decimal es equivalente a usar el operador unario menos de tipo System.Decimal.


Como puede ver, no hay un operador menos definido en los cortos; la resolución de sobrecarga selecciona la que está en las inyecciones porque esa es la mejor coincidencia de todos los operadores unitarios menos disponibles.

+1

Gran respuesta; ¡Gracias! Sin embargo, me pregunto por qué no hay un operador menos definido definido en los pantalones cortos. ¿Alguna teoria? – rabidpebble

+0

@rabidpebble Esto es lo mismo, por supuesto, para (¿todos?) Operadores binarios. Por ejemplo 'p.mID + p.mID',' p.mID/p.mID', 'p.mID y p.mID' y muchos otros tendrán el tipo' int' incluso cuando ambos operandos son 'cortos's . –

2

No hay un operador menos que tome un valor corto. En cambio, la resolución de sobrecarga elige la versión int del operador unario negativo y realiza una conversión implícita.

Cuestiones relacionadas