2009年06月10日

Decimalは、プリミティブではない

   このエントリーをはてなブックマークに追加 Clip to Evernote
このコードを実行しても、uncheckedが有効に働いてくれずに、
「Decimal 型の値が大きすぎるか、または小さすぎます。」
というOverflowException例外が発生してしまいます。

decimalは、CLRが直接演算できるプリミティブな型ではないためのようです。
実際に、以下のコードを実行してみると、


decimal型では、falseが表示され、IsPrimitive プロパティがfalseであることが分かります。
※実際には、decimalの演算で、uncheckedをしたいという要求はないのですが、興味があって試してみました。


ちなみに、C#では、uncheckedがデフォルトなので、intやlongの演算でoverlfowが発生しても例外が発生しません。
例外を発生させたいならば、

のように、checkedで囲む必要があります。


この記事へのコメント
言われてみればそうですね。
組み込み整数型なのに、checkedが効かないのは、バグに該当するのかも。
実体的には、構造体のようなので、プリミティブではないということなんでしょうけど。
>uncheckedがデフォルト
コンパイルオプションで、デフォルトを変更できますね。
Posted by BLUEPIXY at 2009年06月11日 04:40
組み込み型なのに、何でだろうって思いますよね。

>コンパイルオプションで、デフォルトを変更できますね。

そうか。ソースコード上からだと、厳密には、どっちか判断できないんですね。

Posted by Gushwell at 2009年06月11日 12:27
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51836503