DOBON.NET DOBON.NETプログラミング掲示板過去ログ

CTypeについて

  • 題名: CTypeについて
  • 著者: maru
  • 日時: 2008/06/02 11:41:12
  • ID: 22169
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[XP,VB.NET2003Framework1.1]
分類:[.NET]

お久しぶりです。半年くらい前にはよくお世話になっていました。
突然ですが、分からないことがあるので教えて下さい。
現在、vb.net2005で記述されたものをvb.net2003に置き換えして
動作するか検証しているのですが型変換でうまくいかないところがあります。

-2005
Option Explicit On
Option Strict On
(略)
※ptrは、IntPtr型でdataPtrはInteger型です。
ptr = CType(dataptr, IntPtr)
これで正常にビルドできますし、実行もできます。

-2003
Option Explicit On
Option Strict On
(略)
※ptrは、IntPtr型でdataPtrはInteger型です。
ptr = CType(dataptr, IntPtr)
は、型Integerの値をSystem.IntPtrに変換できませんとエラーになります。

2003でエラーになる理由も知りたいのですが、2005でInteger型のものをIntPtr構造体に変換したら内部的(ptrに何が入る?)何が起きているかも知りたいです。2005の環境があれば試すのですがないのでお聞きしています。

分かる方いらっしゃいましたらお願いします。
> 2003でエラーになる理由も知りたいのですが、2005でInteger型のものをIntPtr構造体に変換したら内部的(ptrに何が入る?)何が起きているかも知りたいです。2005の環境があれば試すのですがないのでお聞きしています。

理由は推測でしかありませんが、
2003ではエラーになる仕様で、2005では変換できるように仕様変更されたのではないでしょうか。(IntegerとIntPtrは異なる型なので、相互の型変換のルールを決める必要があり、2003までは未定義で2005では定義されたと考えられます)

試してませんが、IntPtr(Int32)のコンストラクタを使った場合と同じ結果ではないかと思います。
後で時間があったら試して見ます。(2008環境ですが)
返信ありです。
調べたところ、IntPtr.op_Explicitを使用したらリビルドは通りました。
期待した動きになるか検証してみます。
  • 題名: Re[3]: CTypeについて
  • 著者: maru
  • 日時: 2008/06/02 17:09:25
  • ID: 22174
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
動作検証に時間がかかる為、一旦閉じます。
ありがとうございました。
解決済み!
■No22170に返信(よねKENさんの記事)
遅くなりましたが試してみました。

> 試してませんが、IntPtr(Int32)のコンストラクタを使った場合と同じ結果ではないかと思います。
> 後で時間があったら試して見ます。(2008環境ですが)

Dim ptr As IntPtr = CType(10, IntPtr)
Console.WriteLine(ptr = new IntPtr(10)) ' 結果はTrue

予想通りでよさそうです。
解決済み!
■No22180に返信(よねKENさんの記事)
> ■No22170に返信(よねKENさんの記事)
> 遅くなりましたが試してみました。
>
>>試してませんが、IntPtr(Int32)のコンストラクタを使った場合と同じ結果ではないかと思います。
>>後で時間があったら試して見ます。(2008環境ですが)
>
> Dim ptr As IntPtr = CType(10, IntPtr)
> Console.WriteLine(ptr = new IntPtr(10)) ' 結果はTrue
>
> 予想通りでよさそうです。

遅れてすみません。返信ありです。
2005からみたいですね。2003でやってみたら当然だめでした。
解決済み!
なにやら意思の疎通が図られているのかちょっと心配になったので。
(というか、僕自身が読んでいて理解に困る部分があったので、どうなの?という意味も込めて)

■No22180に返信(よねKENさんの記事)
>>試してませんが、IntPtr(Int32)のコンストラクタを使った場合と同じ結果ではないかと思います。
>>後で時間があったら試して見ます。(2008環境ですが)
>
> Dim ptr As IntPtr = CType(10, IntPtr)
> Console.WriteLine(ptr = new IntPtr(10)) ' 結果はTrue
>
> 予想通りでよさそうです。

これは
・ CType(Int32, IntPtr) は 2003 で動かないらしい
・ IntPtr(Int32) のコンストラクタと同じ意味になるか?
という実験をしてみた結果だと思います。
なので

■No22189に返信(maruさんの記事)
> 遅れてすみません。返信ありです。
> 2005からみたいですね。2003でやってみたら当然だめでした。

この流れがちょっと読めませんでした。
この構文が2005からで、2003ではダメというのは最初の投稿から言われていたわけで
だとしたら IntPtr(Int32) のコンストラクタで代用できないか?という検証だった
とすると、そりゃダメだよね2003で試したわけじゃないもの、という話で。

ちなみに IntPtr.op_Explicit が 2005 以降(.NET Framework 2.0以降)では削除されている
ようなので、その代わりに CType(Int32, IntPtr) が有効になるように変更になったのでは
ないかと思います。
自分であればデグレーションとは言え、2003 でしか動かない op_Explicit よりは IntPtr(Int32)
のコンストラクタの方を使うかもしれませんね。
(というか op_Explicit を知りませんでした)
解決済み!
2008/06/04(Wed) 11:10:39 編集(投稿者)

■No22192に返信(ぽぴ王子さんの記事)
> ちなみに IntPtr.op_Explicit が 2005 以降(.NET Framework 2.0以降)では削除されているようなので、
すみません、それはどういう意味でしょうか?
その発言の根拠となる資料を提示していただければ、と。

少なくとも、SDK 上には記載がありますし、
http://msdn.microsoft.com/ja-jp/library/a0f1byxz.aspx
.NET 2.0 の VB コンパイラで、
 Dim p As IntPtr = IntPtr.op_Explicit(123)
を実行したところ、Option Strict に設定に関わらず動作しましたし、
.NET 3.5 の IL を見ても、実装されているようでしたが…。

> その代わりに CType(Int32, IntPtr) が有効になるように変更になったのでは
それは逆だと思いますよ。
VB2005 未満では、演算子のオーバーロードが実装されていなかったため、
CType が動作しなかった、という事情なのだと思います。

演算子のオーバーロードがサポートされていない言語の場合、縮小型変換
(明示的な型変換)のために、op_Explicit メソッドの呼び出しが必要だったかと。

なお、CLS 上においては、op_Implicit または op_Explicit のいずれかが
その戻り値の型でオーバーロードされた場合は、その代わりとなる変換方法を
提供する必要があるとされており、それが件のコンストラタ指定であったり、
あるいはその逆の、IntPtr.ToInt32/64 メソッドであるのでしょう。


《参考資料を追記》
http://smdn.invisiblefulmoon.net/ikimasshoy/dotnet/classlibrary.html#parag5
http://smdn.invisiblefulmoon.net/ikimasshoy/dotnet/classlibrary.html#parag8
解決済み!
■No22193に返信(魔界の仮面弁士さんの記事)

>>ちなみに IntPtr.op_Explicit が 2005 以降(.NET Framework 2.0以降)では削除されているようなので、
> すみません、それはどういう意味でしょうか?
> その発言の根拠となる資料を提示していただければ、と。
>
> 少なくとも、SDK 上には記載がありますし、
> http://msdn.microsoft.com/ja-jp/library/a0f1byxz.aspx
> .NET 2.0 の VB コンパイラで、
>  Dim p As IntPtr = IntPtr.op_Explicit(123)
> を実行したところ、Option Strict に設定に関わらず動作しましたし、
> .NET 3.5 の IL を見ても、実装されているようでしたが…。

すいません。
どうも op_Explicit について誤解していたようです。
私の No.7 の投稿は不正確なものということで撤回させてください。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板