かるあ のメモ

アクセスカウンタ

zoom RSS オブジェクトと文字や数字の比較はオブジェクト

<<   作成日時 : 2007/11/03 12:39   >>

ブログ気持玉 0 / トラックバック 2 / コメント 12

これの続き とりこびとさん が乗っ取られた!! [Option SortOf]

とりこびとさんからの脅迫が怖かったので、MSDNオフライン中にVirtualPCを起動してコードを書いてました。(それをみた ひろえむさん から変な顔をされたw)
で、今日も微妙に時間がないのでコードの説明は特になし。(コメントにいろいろ書いときましたが)わからなかったらコメント欄に質問ください。

Dim Items() = { New With {.Name = "かるあ" }, _
                New With {.Name = "???" } }
Dim ItemType = New With {.Name = "" }

' Object と 何かを比較する場合
' コンパイル時には Object として評価される。
Dim obj1 As Object = 1
Dim result0 = obj1 > 1
Console.WriteLine("Result0 Type =" & result0.GetType().Name)
' 実行時は Boolean で評価されている
' Result0 Type = Boolean

' 遅延バインドされたプロパティも
' コンパイル時には Object として評価される。
Dim obj2 As Object = New With {.Name = "かるあ"}
Console.WriteLine("obj2.Name Type=" & obj2.Name.GetType().Name)
' 実行時は String で評価されている
' obj2.Name Type = String

' 遅延バインド:警告
' 暗黙の型変換:警告
' item.Name の型が Object なので
' item.Name = "かるあ" の結果は Object
Dim query0 = From item In Items Where item.Name = "かるあ"

' 遅延バインド:警告
' Where の型は Func(Of Object, Boolean) なので
' Boolean で結果を返す。
Dim query1 = From item In Items _
            Where Convert.ToBoolean(item.Name = "かるあ")

' 型指定をして比較する。
Dim query2 = From item In Items _
            Where item.Name.ToString() = "かるあ"
           
' 警告なし。
Dim query3 = From item In Items _
            Where Cast(item, ItemType).Name > "かるあ"


匿名型のキャストにはこれを使う
Public Shared Function Cast(Of T)(ByVal AnonymouseObject As Object, ByVal TargetType As T) As T
    Return DirectCast(AnonymouseObject, T)
End Function


警告具合がわかるように画像でもどうぞw
画像


もうひとつ画像を
画像

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(2件)

タイトル (本文) ブログ名/日時
匿名型配列のキャスト
前回の オブジェクトと文字や数字の比較はオブジェクト のコメント欄で Streetw☆ さんが、匿名型のキャストを発展させて匿名型配列のキャストを行っていました。 で、以前 connect に 匿名型配列をもっと扱いやすくして〜というフィードバックを出していたんだけれど、こんなお返事が返ってきましたよ。 ...続きを見る
かるあ のメモ
2007/11/13 12:49
VB10 の 匿名型配列
VB9 の時はなんで出来ないんだと他方から言われていた匿名型配列ですが、VB10ではこんな構文で出来るようになっています。 インテリセンスをみると ちゃんと Name と推論されているのがわかりますね。ただ、匿名型の配列ってデモコードとかテストコードぐらいでしか使い道が無いように思えるんですよね。 そういえば去年はVBでもやれば出来るんだぞってことを書きたくてこんなエントリがありましたね。w 匿名型配列のキャスト オブジェクトと文字や数字の比較はオブジェクト まあまあ厳しく... ...続きを見る
かるあ のメモ
2008/12/08 00:44

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(12件)

内 容 ニックネーム/日時
タイトルなしはやめといた
かるあ
2007/11/03 12:50
Objectと比較ってなんか変な感じだったんだけれど
そうか、Objectと比較しているところも遅延バインディングか
かるあ
2007/11/03 13:17
楽しみにしてました!
ほんと、あの部分にコメントいただけるなんて、お客様お目が高いって思いましたw
とりこびとさんより先に読ませてもらいますね。
#とりこびとさんは土日は電池が切れるみたいですしw
実は私もあれから調べてたんですけど、調べるのって結構楽しかったです。
コメントいただいてなかったら、楽しい思いができないところでしたw
では早速、ふむふむ〜
#こちらのブログの雰囲気がまだわかってないので、場違いなコメントしてたらごめんなさい。
Streetw☆
2007/11/03 14:35
リンク先→トラックバック先→リンク先→・・・
って追っかけてたら、戻って来られなくなりそうでしたw

少し補ってコンパイラを助けてあげると、遅延も暗黙の型変換も厳しくしておけるんですね!
特に、匿名型へのキャストなんてできるの知らなかったので、勉強になりました!

わんくまのコメント欄にこちらへのリンク書いてもらえるといいなって思いました〜
私コメントに書いて来ちゃっていいですか?
Streetw☆
2007/11/03 15:57
Street☆さんこんにちは

ソースの説明はないしかなり不親切なエントリですが、楽しんでもらえたようでよかったです。

VB の 型推論 がもう少し頑張ってくれるとこんなに苦労しなくて済むんですけれどね。
コレクションイニシャライザが実装されなかったのはちょっとショックでした。

> コメントの件
向こうにも書きましたが、このブログは info ドメイン なんで、わんくまのコメントはスパムブロックではじかれちゃうんですよね。

情報発信面白くないですか?
わんくま でも はてな でもどこでもいいのでブログを開始するようでしたら教えてください。
かるあ
2007/11/04 20:55
こんばんは〜
はい、楽しませてもらいましたし、大収穫でした(o^-^o)
読んでるとき頭から煙が出てましたけどw
リンクの件、そうなんですか。とても残念です。
> 面白くないですか?
頂いたコメントに返信するのは楽しかったですw
ブログはたぶんしないけど、始めたらもっちろんお知らせしますね。
これからも情報発信がんばってください。
Streetw☆
2007/11/04 23:40
取り急ぎお礼だけ♪

ただ、かるあさんには脅迫していない件。
とりこびと
2007/11/05 08:56
> とりこびとさん
気のせいかな?w
かるあ
2007/11/05 09:33
ほんの少し変更してみました。
こうするとOption Strict Onのままにしておけますね!
#「まあまあ」じゃなくっても全然良さそうです(汗

Dim items() As Object = _
 {New With {.Name = "A", .Age = 31}}
Dim itemType = _
 New With {.Name = "", .Age = 0}

Dim names = _
 From item _
 In CastToEnumerable(items, itemType) _
 Where item.Age > 20 _
 Select item.Name

Public Shared Function CastToEnumerable(Of T)( _
  ByVal obj As Object, ByVal type As T) _
  As IEnumerable(Of T)
 Return DirectCast(obj, IEnumerable(Of T))
End Function
Streetw☆
2007/11/05 13:44
「こうすると」じゃなく「こうしても」でした。
Streetw☆
2007/11/05 13:51
> Streetw☆さん
Where で Cast した場合は For Each するときにもう一度 Cast する必要があるけれど、From でキャストすると 値の列挙に型推論が聞いてくれるので後々楽そうですね。
かるあ
2007/11/05 21:52
ステートメントで書いた場合、
Dim query = CastToEnumerable(items, itemType).Where(Function(item) item.Name = "A")
For Each item In query
&nbsp; Console.Write(item.Name)
Next

とかけるのでこちらのほうが素直ですね。
かるあ
2007/11/05 22:01

コメントする help

ニックネーム
本 文
オブジェクトと文字や数字の比較はオブジェクト かるあ のメモ/BIGLOBEウェブリブログ
文字サイズ:       閉じる