sirve - tamaño de int c#
Unario menos en un corto se convierte en int? (2)
Lo remito a la sección 7.6.2 de la especificación, que dice:
Para una operación de la forma -x, se aplica la resolución de sobrecarga del operador unario para seleccionar una implementación de operador específica. 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 entera:
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 entero de decimales.
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.
Negación de coma flotante:
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 definido en los pantalones 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.
En el siguiente:
public class p
{
short? mID;
short? dID;
}
short id = p.mID ?? -p.dID.Value;
El compilador me da el error:
Error 21 No se puede convertir implícitamente el tipo ''int'' en ''corto''. Existe una conversión explícita (¿falta un elenco?)
Tengo que cambiar el código a lo siguiente para que funcione:
short id = p.mID ?? (short)-p.dID.Value;
Es como si el compilador estuviera haciendo algo como (int) 0 - p.dID.Value, o ese Int16.operator - está devolviendo Int32s ...?
No hay un operador unario negativo 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.