次の方法で共有


方法: 匿名型宣言でプロパティ名と型を推論する (Visual Basic)

匿名型には、プロパティのデータ型を直接指定するためのメカニズムはありません。 すべてのプロパティの型が推論されます。 次の例では、 NamePrice の型は、初期化に使用される値から直接推論されます。

' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

匿名型は、他のソースからプロパティ名と型を推論することもできます。 以下のセクションでは、推論が可能な状況の一覧と、そうでない状況の例を示します。

推論の成功

匿名型は、次のソースからプロパティ名と型を推論できます。

  • 変数名から。 匿名型 anonProduct には、 productNameproductPriceの 2 つのプロパティがあります。 これらのデータ型は、それぞれ元の変数の StringDoubleになります。

    Dim productName As String = "paperclips"
    Dim productPrice As Double = 1.29
    Dim anonProduct = New With {Key productName, Key productPrice}
    
    ' To create uppercase variable names for the new properties,
    ' assign variables productName and productPrice to uppercase identifiers.
    Dim anonProduct1 = New With {Key .Name = productName, Key .Price = productPrice}
    
  • 他のオブジェクトのプロパティ名またはフィールド名から。 たとえば、NameプロパティとIDプロパティを含むCarClass型のcar オブジェクトについて考えてみます。 car オブジェクトの値で初期化されたNameプロパティとIDプロパティを使用して、新しい匿名型インスタンスを作成car1、次のように記述できます。

    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 変数は、プロパティが 1 つ、 Firstという名前の文字を持つ匿名型です。 このコードでは、関数 Firstによって返される文字 "E" が表示されます。

    Dim aString As String = "Example String"
    Dim anon2 = New With {Key aString.First()}
    ' The variable anon2 has one property, First.
    Console.WriteLine(anon2.First)
    

推論エラー

名前の推論は、次のような多くの状況で失敗します。

  • 推論は、引数を必要とするメソッド、コンストラクター、またはパラメーター化されたプロパティの呼び出しから派生します。 someFunctionに 1 つ以上の引数がある場合、anon1の前の宣言は失敗します。

    ' 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.Namecar1.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のメンバーの名前と同じです。 たとえば、 EqualsObjectのメソッドであるため、次の宣言は失敗します。

    ' 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"}
    

こちらも参照ください