odsyłam do sekcji 7.6.2 specyfikacji, który stanowi:
Dla funkcjonowania -x formy, jednoskładnikowa rozdzielczości przeciążenie operator jest stosowany, aby wybrać konkretną realizację operatora. Operand jest konwertowany na typ parametru wybranego operatora, a typ wyniku jest typem zwracanym przez operatora. Predefiniowane operatorzy negacja są:
całkowita negacja:
int operator –(int x);
long operator –(long x);
Wynik jest obliczany poprzez odjęcie X od zera. Jeśli wartość x jest najmniejszą reprezentowalną wartością typu operandu (-2^31 dla int lub -2^63 dla długiego), wówczas negacja matematyczna x nie jest reprezentowana w ramach typu argumentu. Jeśli wystąpi to w sprawdzonym kontekście, generowany jest wyjątek System.OverflowException; jeśli występuje w niezaznaczonym kontekście, wynikiem jest wartość argumentu, a przepełnienie nie jest zgłaszane. Jeśli operand operatora negacji jest typu uint, jest konwertowany na typ long, a typ wyniku jest długi. Wyjątkiem jest reguła zezwalająca na zapisanie wartości int -2147483648 (-2^31) jako liczby całkowitej w calach.
Jeśli operand operatora negacji jest typu ulong, wystąpi błąd podczas kompilacji. Wyjątkiem jest reguła, która pozwala na zapisanie długiej wartości -9223372036854775808 (-2^63) jako dziesiętnej liczby całkowitej.
zmiennoprzecinkowych Negacja:
float operator –(float x);
double operator –(double x);
Wynik jest wartością X z jego znak odwrócone. Jeśli x to NaN, wynikiem jest również NaN.
dziesiętny Negacja:
decimal operator –(decimal x);
Wynik jest obliczana przez odjęcie x od zera. Dziesiętna negacja jest równoważna z użyciem jednoargumentowego operatora minus typu System.Decimal.
Jak widać, nie ma jednoznacznego operatora minus zdefiniowanego na szortach; Rezolucja o przeciążeniu wybiera jedną z nich, ponieważ ta jest najlepiej dopasowana do wszystkich dostępnych jednoargumentowych operatorów minus.
Świetna odpowiedź; dzięki! Muszę się zastanowić, dlaczego nie ma jednoznacznego operatora minusowego zdefiniowanego na szortach. Jakieś teorie? – rabidpebble
@rabidpebble To samo dotyczy oczywiście (wszystkich?) Operatorów binarnych. Na przykład 'p.mID + p.mID',' p.mID/p.mID', 'p.mID & p.mID' i wiele innych będzie miało typ' int' nawet, gdy oba operandy są 'krótkie's . –