2010-01-13 32 views
8

在以下幾點:一元減一個變成了一個整數?

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

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

編譯器給我的錯誤:

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

我的代碼更改爲以下,它的工作:

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

這是因爲如果編譯器正在執行像(int)0 - p.dID.Value之類的操作,或者Int16.operator正在返回Int32s ...?

回答

13

我是指你本說明書中,其中規定的節7.6.2:


對於-x形式的操作中,一元運算符重載方案被施加到選擇特定的運算實現。操作數轉換爲所選運算符的參數類型,結果的類型是運算符的返回類型。預定義的否定操作符是:

整數否定:

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

結果由從零中減去x來計算的。如果x的值是操作數類型的最小可表示值(-2^31代表int或-2^63代表長),則x的數學否定在操作數類型中不可表示。如果在檢查的上下文中發生這種情況,則會引發System.OverflowException;如果它發生在未經檢查的上下文中,則結果是操作數的值,並且不報告溢出。 如果否定運算符的操作數是uint類型,則它將轉換爲long類型,並且結果的類型很長。一個例外是允許將int值-2147483648(-2^31)寫成十進制整數字符的規則。

如果否定運算符的操作數是ulong類型,則會發生編譯時錯誤。一個例外是允許將長整型值-9223372036854775808(-2^63)寫爲十進制整數文字的規則。

浮點否定:

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

結果是x的值與它的符號反轉。如果x是NaN,那麼結果也是NaN。

小數否定:

decimal operator –(decimal x); 

結果由從零中減去x來計算的。十進制否定相當於使用System.Decimal類型的一元減運算符。


正如你所看到的,在短褲上沒有定義一元減算子;重載決議選擇一個整數,因爲這是所有可用的一元減算子的最佳匹配。

+1

很好的回答;謝謝!不過,我不得不想知道爲什麼沒有定義短褲的一元減算子。任何理論? – rabidpebble

+0

@rabidpebble當然,對於(所有?)二元運算符,這也是一樣的。例如'p.mID + p.mID','p.mID/p.mID','p.mID&p.mID'和其他許多類型都將具有類型'int',即使兩個操作數都是'short' 。 –

2

沒有一元減法運算符取得短暫值。相反,重載解決方案選擇一元減運算符的整數版本並進行隱式轉換。