Share via


如何:在匿名類型宣告中推斷屬性名稱和類型 (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。 其資料類型分別是下列原始變數: 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}
    
  • 透過其他物件的屬性或欄位名稱。 例如,考慮使用類型為 car 且包含 CarClassName 屬性的 ID 物件。 若要利用使用 car1物件值初始化的 NameID 屬性來建立新的匿名類型執行個體 ( car ),您可以撰寫下列項目:

    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 產生的屬性會有一個類型 Book(Of XElement) 的屬性 IEnumerable

  • 透過沒有參數的函式 (如下列範例中的 SomeFunction )。

    Dim sc As New SomeClass
    Dim anon1 = New With {Key sc.SomeFunction()}
    

    下列程式碼中的變數 anon2 是具有一個屬性 (名稱為 First的字元) 的匿名類型。 此程式碼會顯示字母 "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 的先前宣告會失敗。

    ' 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"}
    
  • 多個屬性的推斷會產生兩個或多個同名的屬性。 推斷回先前範例中的宣告,無法將 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}
    

    請注意,大小寫的變更 (大寫與小寫字母之間的變更) 並不會讓這兩個名稱不同。

    Dim price = 0
    ' Not valid, because Price and price are the same name.
    ' Dim anon7 = New With {Key product.Price, Key price}
    
  • 一個屬性的初始類型和值取決於尚未建立的另一個屬性。 例如,除非已初始化 .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"}
    

另請參閱