これは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
と同じです)。
long
(System.Int64
)だけでなく、int
(System.Int32
)と同じバグが発生します。
比較のために、コンパイラは、const
のオペランドを持つdividend/divisor
を、dividend % divisor
よりはるかに優れて処理します。
私の質問:
アム私は右、これはバグでしょうか?コンパイル時定数-1
で% -1
を使用することがかなり愚かであっても、後方互換性のため、修正したくないよく知られているバグですか?あるいは、C#コンパイラの次期バージョンで修正できるように報告する必要がありますか?
@EricLippertがこの質問のために右の群衆を描いているかもしれないと言っています:) –
@Morten、この時点で、彼はCoverityの彼の農場からひどく目を引くかもしれません。 ;) –
私はこのことがなぜ起こっているのか、それを私に苛立たせるので、あなたはこれに恩恵を与えるべきだと思います。仕様では、実行時例外をスローする可能性のある定数式は、コンパイル時にコンパイル時エラーを引き起こすことになります。 –