例によって(?)タイトルコールは仁鶴師匠でお願いします(ぉ。
先だってR・田中一郎さんがC♯3.0についてのエントリをたくさんなさっていますが、私ってば、やっぱ Visual Basic 9.0 かな?というわけで、Visual Basic の次期バージョン Visual Basic 9.0 の個人的なまとめのその1です。
おおよそ以下の情報を元に書いてます。英語です。私は英語が苦手ですので、ちゃんとしたことはネタ元から、ボケはこのエントリからでお願いしますね。
Overview of Visual Basic 9.0(http://msdn2.microsoft.com/en-us/library/ms364068(vs.80).aspx)
今回は Implicitly Typed Local Variables (・・・暗黙の型なローカル変数?)について。
Dim i = 0
Dim s = "黙れ小僧!"
どうやらこういうこと(?)らしいです。パッと見、とても不安になる見た目ですね。Visual Basic 8.0 の感覚でいくと、Option Strict On だと、コンパイルエラーです。ですが、実際にはそれほど不安なわけでもなく、コンパイラがちゃんと右側から型を推測してくれるらしいです。つまり、上記のコードで、ローカル変数 i は Integer型、ローカル変数 s はString型と推測されるということですね。
でもって、もちろん・・・
Public Class WankumaMember
Private _id As Integer
Public Property ID() As Integer
Get
Return _id
End Get
Set(ByVal value As Integer)
_id = value
End Set
End Property
Private _name As String
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
End Class
こんなクラスがあったとしても、
Dim member = New WankumaMember
ローカル変数 member は WankumaMember 型と推測されます。
で、かるあさんのエントリによると、この機能はオプションによって制御できるとのこと。その新しく追加されたオプションは Option Infer だそうです。これ、デフォルトが On になるようですので、
Option Strict On
Public Class Program
Public Sub Hoge()
Dim i = 0
Dim s = "黙れ小僧!"
Dim member = New WankumaMember
End Sub
End Class
これ↑はOK。
Option Strict On
Option Infer Off
Public Class Program
Public Sub Hoge()
Dim i = 0
Dim s = "黙れ小僧!"
Dim member = New WankumaMember
End Sub
End Class
これ↑はダメになります。
また、この機能はコンパイラによってなされるものですので、Infer Onの状態での遅延バインディングは、明示的に行わなければならなくなります。というか、明示的に行ってください、お願いします(誰に?w)。
Dim member As Object = New WankumaMember
さらにさらに、このImplicitly Typed Local Variablesってば、For...Next や For Each...Next ステートメントなどのループ コントロール変数にもいけると。
Dim wankumaMembers = New List(Of WankumaMember)
For Each member In wankumaMembers
System.Console.WriteLine(member.Name)
Next
なるほどね~。現行バージョンでも Option Strict Off でコードとして同じ状態は書けますが、そのとき変数 member は Object型になっていました。これがちゃんとWankumaMember型として機能するわけですね。
ん~、個人的には別にOK~って感じです。でもちゃんとやらないと Option の組み合わせがごちゃごちゃしちゃいそうな予感です。できれば Option の類はコード上に載っけてほしいですね。