方法 : 匿名型の宣言におけるプロパティ名と型を推論する
更新 : 2007 年 11 月
匿名型には、プロパティのデータ型を直接指定する機構はありません。すべてのプロパティの型は、推論されます。次の例では、Name と Price の型は、それらを初期化するために使用される値から、直接推論されます。
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
匿名型は、プロパティの名前と型を、他のソースから推論することもできます。この後のセクションで、推論が可能な状況の一覧と、推論が行われない状況の例を示します。
正常な推論
匿名型は、プロパティの名前と型を、次のソースから推論できます。
変数名から。匿名型 anonProduct には、name と price という 2 つのプロパティがあります。それらのデータ型は、それぞれ、元の変数のデータ型である String と Double になります。
Dim productName As String = "paperclips" Dim productPrice As Double = 1.29 Dim anonPproduct = New With {Key productName, Key productPrice} ' To create uppercase variable names for the new properties, ' assign variables productName and productPrice to uppercase identifiers. Dim anonPproduct1 = New With {Key .Name = productName, Key .Price = productPrice}
他のオブジェクトのプロパティまたはフィールドの名前から。たとえば、Name プロパティと ID プロパティを含む CarClass 型の car オブジェクトがあるとします。新しい匿名型のインスタンス car1 を作成し、car オブジェクトの値を使用して Name プロパティと ID プロパティを初期化するには、次のように記述できます。
Dim car1 = New With {Key car.Name, Key car.ID}
前の宣言は、匿名型 car2 を定義する、次の長いコードに相当します。
Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
XML メンバ名から。
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
推論後の anon の型は、IEnumerable (Of XElement) 型の 1 つのプロパティ Book を持ちます。
次の例に示す SomeFunction などのパラメータを持たない関数から。
Dim sc As New SomeClass
Dim anon1 = New With {Key sc.SomeFunction()}
次のコードの anon2 変数は、First という文字である 1 つのプロパティを持つ匿名型です。このコードは、文字 "E" を表示します。この文字は、First 関数によって返されます。
Dim aString As String = "Example String" Dim anon2 = New With {Key aString.First()} ' The variable anon2 has one property, First. Console.WriteLine(anon2.First)
推論の失敗
名前の推論は、次のようなさまざまな状況で失敗します。
推論が、引数を必要とするメソッド、コンストラクタ、またはパラメータ化されたプロパティの呼び出しから派生する。前の anon1 の宣言は、someFunction に 1 つ以上の引数がある場合は失敗します。
' Not valid.
' Dim anon3 = New With {Key sc.someFunction(someArg)}
この問題は、新しいプロパティ名の割り当てによって解決します。
' Valid.
Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
推論が、複合式から派生される。
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}
このエラーは、式の結果をプロパティ名に割り当てることで解決できます。
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}
複数のプロパティの推論で、名前が同じ 2 つ以上のプロパティが生成される。前のコード例の宣言で説明すると、同じ匿名型のプロパティとして、product.Name と car1.Name の両方を指定することはできません。これは、各プロパティの推論される識別子が Name になるためです。
' Not valid.
' Dim anon5 = New With {Key product.Name, Key car1.Name}
この問題は、プロパティの名前を区別する値を割り当てることで解決できます。
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
大文字と小文字の違いでは、2 つの名前は区別されません。
Dim price = 0
' Not valid, because Price and price are the same name.
' Dim anon7 = New With {Key product.Price, Key price}
1 つのプロパティの初期型と値は、まだ確立されていない別のプロパティに依存します。たとえば、.IDName = .LastName は、.LastName が既に初期化されていない限り、匿名型の宣言内で有効ではありません。
' Not valid.
' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
この例では、プロパティを宣言する順序を逆にすることで、問題を修正できます。
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
匿名型のプロパティの名前は、Object のメンバの名前と同じです。たとえば、次の宣言は、Equals が Object のメソッドなので失敗します。
' Not valid.
' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _
' "greater than", Key .Less = "less than"}
この問題は、プロパティの名前を変更することで修正できます。
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", _ Key .GreaterString = "greater than", _ Key .LessString = "less than"}