- PR -

Int32 を Decimal にキャストできません

投稿者投稿内容
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-05-29 11:28
引用:

どうやら、プリミティブ型はオブジェクトであるにもかかわらず特別仕様によって、ヒープに配置されないようです。



は、プリミティブ型ではなく、値型全般にあてはまります。

引用:

これをヒープに配置するために Object 型への変換(ボックス化)がおこなわれる。という認識でいいんでしょうか。



いいです。

引用:

C++ や J# の int も C# と同様にオブジェクトなのか?



言語処理系が隠したり、相互変換する場合もあります。

ランタイムが使用する型が言語非依存に設計されているだけで、各言語処理系で使用する型がすべてそれをきっちりと反映しなければならない、というルールはありません。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-05-29 13:11
私は普段、あまり細かいところまで意識して言語を使っているわけではありません。
なのでこういった話題にはあまり参加してこなかったのですが、未記入さんに触発されたので書いてみます。

引用:

未記入さんの書き込み (2008-05-29 10:50) より:

Convert.ToDecimal(Object value) を使用することで問題を解決することができました。パラメータの型が Object になっているので、もしかすると、内部で Decimal.Parse(value.ToString()) しているだけかと心配しましたが、リファレンスを読むとパラメータとして正しく処理されるのは IConvertible インターフェイスを実装した Object だけということなので、Object.ToString() に頼った変換ではなさそうです。

なんで、この ToDecimal(Object value) のシグネチャを ToDcimal(IConvertible value) にしなかったんでしょうね?




そのほうが便利だから、楽だから、だと思います。

未記入さんがそうされたように、Int32やDoubleなど、実行時に複数の異なる型が想定されるものを入れる器としてはObject型のインスタンスを使うと思います。
ComboBox.SelectedValueや、DataGridViewCell.ValueなどのプロパティもObject型です。
それであれば、そのままObject型を受け取る作りにしてあったほうが便利だと思います。

また、IConvertible インタフェースというものは、言語仕様を陰から支えているような存在だと思います。
そういったものはあまり表に出してやらず、普段は意識しないで使えたほうが都合がよいのだと思います。
# 実際、知らずに「基本型どうしは変換できる」くらいの意識で使っているC#プログラマも少なくないのではないでしょうか…というか私がそうでした

スキルアップ/キャリアアップ(JOB@IT)