- PR -

型変換制御(Option Strict)について

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-10-10 10:16
引用:

よねKENさんの書き込み (2007-10-10 09:25) より:

確かに自分の書くコードではこのようなパターンを使うことはめったにありませんね。


はい、そういうつもりでも書きました。 ブール値は 2 値しか持たないので早い段階 (多くはコンパイル時) に型は自明になりますし、セキュアな観点からもそれが望ましいと思います。 あくまで例として受け取ってもらえれば何も弊害はないですから茶々入れですね。 ごめんなさい。

以下はよねKENさんに向けてではないです。

型付けが強い言語は型のメンバを利用するにおいて、とにかく型を明示しなければいけません。 だからキャストすれば解決する... ではなくて、キャストの回数を減らすことも肝要だと思います。 bool 以外でも基本的な型 (値型) の多くはキャストの出番が少ないです。(Parse はありますけど)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-10-10 13:33
早速、型変換について勉強しました。
以下はmsdnの「VB .NET プログラミングリファレンス」です。「Cast と Convert」は
まだ出てきませんが基本を理解するにはわかりやすいサイトです。
http://www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-5.aspx

Bisual Basic 中学校>初級講座>型の指定
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard36.htm

[ メッセージ編集済み 編集者: だんじり 編集日時 2007-10-10 15:52 ]
RUN
常連さん
会議室デビュー日: 2007/10/05
投稿数: 32
お住まい・勤務地: 東京都
投稿日時: 2007-10-11 01:52
引用:

だんじりさんの書き込み (2007-10-10 10:10) より:
ところで、2番目の質問の「Double' から 'Boolean' への暗黙的な変換です」エラー
ですが、次のように評価片方にするとエラーが出ないのですが両方にするとエラーにな
ります。変換のエラーならどちらかで発生すると思いますが、なぜなのでしょうか?
前評価のみ→If dreader(2) = 誕生日 Then
後評価のみ→If dreader(3) = True Then
ヒントだけでも教えていただければ自分自身で勉強します。



最初の方でよねKENさんが仰られていますが、各変数の型はなんでしょうか?
この部分の提示が無ければ、答えを出すのはかなり難しいと思います。

1:dreaderとは何ですか?
  Objct配列でしょうか?それともデータテーブルか何かでしょうか?
  それとも、dreaderは実は関数で戻り値を返してくるのでしょうか?或いはプロパティだとか
2:誕生日は何ですか?
  ダブルクォーテーションで囲っていないので文字リテラルの"誕生日"ではないとは思いますが、
  DateTime型でしょうか?文字列型でしょうか?Integer型でしょうか?Double型でしょうか?
3:Trueはブール型キーワードのTrueでよいでしょうか?
 (予約語一覧にはTrueって無いのね、調べてみてびっくりしたです)

以上についての型が分からない為、憶測でしか答えを出す事が出来ません。
変数の型情報と言うのは、問題の原因を探る上でかなり重要な要素ですので、きちんと提示していただけると有りがたいです。

一応、現状での憶測では
if文でAndでつないだ場合、dreader(2)がDouble型で解釈された為に本来ならブール型として扱いたいdreader(3)をdreader(2)と同じ型であると判断してDouble型とTrueを比較しようとして、その際にDoubleからBooleanへの暗黙的変換が発生してしまった。
と言うのが考えられる気がします。

また、突拍子も無い発想をすれば、dreader(2) = 誕生日の結果が何故かDouble型になっていて、Andが論理演算子ではなくBit演算子のAndと認識してしまっている可能性とかもありえるかもしれません。

いずれにせよ、各々の型が何であるかによって、適切な対処方法は変わってくると思います。
だんじり
大ベテラン
会議室デビュー日: 2007/08/10
投稿数: 155
お住まい・勤務地: 神奈川県
投稿日時: 2007-10-11 17:46
RUNさん、ありがとうございました。
Andの両方に対して丁寧に型設定を行うと、エラーが出なくなりました。
ただ、「暗黙的な変換」はなしに設定して使用いたします。
RUN
常連さん
会議室デビュー日: 2007/10/05
投稿数: 32
お住まい・勤務地: 東京都
投稿日時: 2007-10-11 20:55
引用:

だんじりさんの書き込み (2007-10-11 17:46) より:
Andの両方に対して丁寧に型設定を行うと、エラーが出なくなりました。
ただ、「暗黙的な変換」はなしに設定して使用いたします。



結局、各々の型が何であるかはご返事いただけないのですね・・・。

一応気をつけて置いたほうがよい事として、たとえ『Option StrictをON』にしていても、全ての暗黙的な変換が起きなくなる訳では有りません。

VB2003の環境での話で恐縮ですが(手元にVB2005が無いので、2005でも同じとは限りませんが)
たとえばINT16からINT32へは暗黙的な変換が発生してしまいます。
その為、INT16の-1がINT32で65535になってしまうと言う事も(機種依存によるので、INT32でも-1となる場合も有ります)
また、関数の引数としてのObject型も注意が必要だったりします。

厳密な型の定義については、コンパイラに全てを任せるのではなく、自分でも意識するよう心がけた方が後々楽かもしれません

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