2010-01-13 15 views
8

w następujących przypadkach:Jednoargumentowy minus na krótkim staje się int?

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

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

Kompilator daje mi błąd:

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

muszę zmienić kod do następujących go do pracy:

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

to tak jeśli kompilator robi coś podobnego (int) 0 - p.dID.Value, lub że Int16.operator - zwraca Int32s ...?

Odpowiedz

13

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.

+1

Świetna odpowiedź; dzięki! Muszę się zastanowić, dlaczego nie ma jednoznacznego operatora minusowego zdefiniowanego na szortach. Jakieś teorie? – rabidpebble

+0

@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 . –

2

Brak jednoargumentowego operatora minusowego, który przyjmuje krótką wartość. Zamiast tego, rozdzielczość przeciążania wybiera wersję int operatora jednoargumentowego i wykonuje niejawną konwersję.

Powiązane problemy