方法 : 匿名型の宣言におけるプロパティ名と型を推論する

更新 : 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"}
    

参照

処理手順

方法 : 匿名型のインスタンスを宣言する

概念

オブジェクト初期化子 : 名前付きの型と匿名型

ローカル型の推論

匿名型

名前付きの型と匿名型の比較

参照

キー (Visual Basic)