我認爲這看起來像是C#編譯器中的一個錯誤。編譯器爲什麼要計算與運行時不同的其餘MinValue%-1?
考慮以下代碼的方法(內):
const long dividend = long.MinValue;
const long divisor = -1L;
Console.WriteLine(dividend % divisor);
它編譯,沒有錯誤(或警告)。 看起來像一個錯誤。運行時,在控制檯上打印0
。
然後而不const
,代碼:
long dividend = long.MinValue;
long divisor = -1L;
Console.WriteLine(dividend % divisor);
當這樣運行時,它正確地導致一個OverflowException
被拋出。
C#語言規範專門提到了這種情況,並說要拋出一個System.OverflowException
。它看起來不取決於上下文checked
或unchecked
(編譯時操作數與餘數運算符的錯誤與checked
和unchecked
相同)。
同樣的問題發生在int
(System.Int32
),而不僅僅是long
(System.Int64
)。
作爲比較,編譯器處理dividend/divisor
與const
操作數比dividend % divisor
好得多。
我的問題:
我說得對不對,這是一個錯誤?如果是的話,這是一個衆所周知的錯誤,他們不希望修復(因爲向後兼容,即使使用% -1
與編譯時常量-1
相當愚蠢)?或者我們應該報告一下,以便他們能夠在即將出版的C#編譯器中修復它?
提起@EricLippert可能會在這個問題的權利人羣:) –
@Morten,在這一點上,他可能只是從他在Coverity棲息困惑地凝視。 ;) –
我認爲你應該對此表示賞罰,因爲它激怒了我爲什麼會發生這種情況。規範說,任何可能拋出運行時異常的常量表達式在編譯時都會導致編譯時錯誤! –