C#で0/0
、例外が発生した場合。
しかし、あなた0.0/0
または0.0/0.0
あなたが得た場合double.NaN
、double.Infinity
それぞれ。
しかし、これらの結果を にキャストするとint
、0 になります。
> (int)double.PositiveInfinity
0
> (int)double.NaN
0
これはなぜですか?無限大は明らかにゼロではないため、ランタイムはキャストエラーを発生させるはずではありませんか?
C#で0/0
、例外が発生した場合。
しかし、あなた0.0/0
または0.0/0.0
あなたが得た場合double.NaN
、double.Infinity
それぞれ。
しかし、これらの結果を にキャストするとint
、0 になります。
> (int)double.PositiveInfinity
0
> (int)double.NaN
0
これはなぜですか?無限大は明らかにゼロではないため、ランタイムはキャストエラーを発生させるはずではありませんか?
コンテキストの種類によって異なります。checked
コンテキストを使用すると、例外が発生します。仕様の関連セクションはセクション 6.2.1 です。
float または double から整数型への変換の場合、処理は、変換が行われるオーバーフロー チェック コンテキスト (§7.6.12) によって異なります。
- チェックされたコンテキストでは、変換は次のように進行します。
- オペランドの値が NaN または無限の場合、System.OverflowException がスローされます。
- それ以外の場合、ソース オペランドはゼロに向かって最も近い整数値に丸められます。この整数値が変換先の型の範囲内にある場合、この値は変換の結果です。
- それ以外の場合は、System.OverflowException がスローされます。
- チェックされていないコンテキストでは、変換は常に成功し、次のように進みます。
- オペランドの値が NaN または無限の場合、変換の結果は変換先の型の指定されていない値になります。
- それ以外の場合、ソース オペランドはゼロに向かって最も近い整数値に丸められます。この整数値が変換先の型の範囲内にある場合、この値は変換の結果です。
- それ以外の場合、変換の結果は宛先タイプの未指定の値になります。
したがって、チェックされていないコンテキストでは、答えは必ずしも 0 ではありません。これは未指定のint
値です。実際、私のテストでint.MinValue
は、チェックされていないコンテキストでは 0 ではなく表示されます。
ただし、基本的に、チェックを行いたい場合は、チェックされたコンテキストを使用します (少なくともその式には)。
これは主に、 double.NAN と double.PositiveInfity (または double.Negative ) が数値ではなく、概念を識別するための値であるという事実によるものです。
演算の結果がundefinedの場合、メソッドまたは演算子は NaN を返します。たとえば、次の例に示すように、0 を 0 で除算した結果は NaN になります。
その概念を説明するためにこれを試してください。
if ((0 / zero) == Double.NaN)
Console.WriteLine("0 / 0 can be tested with Double.NaN.");
else
Console.WriteLine("0 / 0 cannot be tested with Double.NaN; use Double.IsNan() instead.");