投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/11/4 13:06:53
>> m.Map.Map_Move(Direction:=sender.Tag)
> これはTagの内容を直接渡しているので、Tagの内容を
> Map.Dir.UpやMap.Dir.Downなどにすれば動作するとすぐ解りました。

Map_Move の引数が Direction As Object の場合には、
 m.Map.Map_Move(Direction:=sender.Tag)
のままで構いませんが、恐らくは Direction As Map.Dir なのですよね。


sender 引数の型は As Object ですし、
Tag プロパティの型も As Object です。

初期設定では Option Strict Off モードでビルドされているので問題になりませんが、
Option Strict On モードでビルドされていた場合、
Map.Dir 型の仮引数に渡す値は、Object 側の値を実引数として渡すのではなく、
Map.Dir 型の実引数を渡す必要があります。そのため、 DirectCast を使って
データ型を揃えてやる必要があるというわけです。


なお、このパターンを実行する場合には、Form の Load イベントにおいて、
 lblMovingUp.Tag = Map.Dir.Up
などのように、「Tag プロパティに Map.Dir 列挙型の値をセットしておく」必要があります。


>> m.Map.Map_Move(Direction:=DirectCast(sender, Control).Tag)
> これもLabelはControlなので、上記を丁寧に書いたやり方だと理解出来ます。

下記いずれも、同じ結果が得られます。

m.Map.Map_Move(Direction:=DirectCast(sender, Control).Tag)
m.Map.Map_Move(Direction:=DirectCast(sender, Label).Tag)


Tag プロパティを実装しているのは Label ではなく、その親クラスである Control なので、
今回はあえて Control 型にキャストしてありますが、Label にキャストしても問題ありません。
(Label クラスは Control の Tag プロパティをそのまま受け継いでいます)


>> m.Map.Map_Move(Direction:=DirectCast(DirectCast(sender, Control).Tag, Map.Dir))
> これ!
> (Label)コントロールのタグをMap.Dirにキャストする???

sender 引数同様、Tag プロパティも As Object なデータ型なので、DirectCast あるいは CType が必要になります。
もしも sender に Label 以外が渡される可能性がある場合には、TryCast を使うこともできます。

Dim lbl As Label = TryCast(sender, Label)
If lbl IsNot Nothing Then
   Dim direction As Map.Dir = CType(lbl.Tag, Map.Dir)
   m.Map.Map_Move(Direction:=direction)
End If