Dela via


Anvisningar: Härleda egenskapsnamn och typer i anonyma typdeklarationer (Visual Basic)

Anonyma typer ger ingen mekanism för att direkt ange datatyperna för egenskaper. Typer av alla egenskaper härleds. I följande exempel härleds typerna av Name och Price direkt från de värden som används för att initiera dem.

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

Anonyma typer kan också härleda egenskapsnamn och typer från andra källor. Avsnitten som följer innehåller en lista över de omständigheter där slutsatsdragning är möjlig och exempel på situationer där det inte är det.

Lyckad slutsatsdragning

Anonyma typer kan härleda egenskapsnamn och typer från följande källor:

  • Från variabelnamn. Anonym typ anonProduct har två egenskaper och productNameproductPrice. Deras datatyper är de ursprungliga variablerna String respektive Double.

    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}
    
  • Från egenskaps- eller fältnamn för andra objekt. Tänk dig till exempel ett car objekt av en CarClass typ som innehåller Name och ID egenskaper. Om du vill skapa en ny instans av anonym typ, car1, med Name och ID egenskaper som initieras med värdena från car objektet, kan du skriva följande:

    Dim car1 = New With {Key car.Name, Key car.ID}
    

    Den tidigare deklarationen motsvarar den längre kodraden som definierar anonym typ car2.

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • Från XML-medlemsnamn.

    Dim books = <Books>
                    <Book Author="Jesper Aaberg">
                        Advanced Programming Methods
                    </Book>
                </Books>
    Dim anon = New With {books...<Book>}
    

    Den resulterande typen för anon skulle ha en egenskap, Book, av typen IEnumerable(Av XElement).

  • Från en funktion som inte har några parametrar, till exempel SomeFunction i följande exempel.

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

    Variabeln anon2 i följande kod är en anonym typ som har en egenskap, ett tecken med namnet First. Den här koden visar bokstaven "E", bokstaven som returneras av funktionen 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)
    

Slutsatsfel

Namninferens misslyckas under många omständigheter, inklusive följande:

  • Slutsatsdragningen härleds från anropet av en metod, en konstruktor eller en parameteriserad egenskap som kräver argument. Den tidigare deklarationen av anon1 misslyckas om someFunction det finns ett eller flera argument.

    ' Not valid.
    ' Dim anon3 = New With {Key sc.someFunction(someArg)}
    

    Tilldelning till ett nytt egenskapsnamn löser problemet.

    ' Valid.
    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
    
  • Slutsatsdragningen härleds från ett komplext uttryck.

    Dim aString As String = "Act "
    ' Not valid.
    ' Dim label = New With {Key aString & "IV"}
    

    Felet kan lösas genom att tilldela resultatet av uttrycket till ett egenskapsnamn.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • Slutsatsdragning för flera egenskaper ger två eller flera egenskaper som har samma namn. Om du refererar tillbaka till deklarationer i tidigare exempel kan du inte visa både product.Name och car1.Name som egenskaper av samma anonyma typ. Det beror på att den härledda identifieraren för var och en av dessa skulle vara Name.

    ' Not valid.
    ' Dim anon5 = New With {Key product.Name, Key car1.Name}
    

    Problemet kan lösas genom att tilldela värdena till distinkta egenskapsnamn.

    ' Valid.
    Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
    

    Observera att ändringar i fall (ändringar mellan versaler och gemener) inte gör två namn distinkta.

    Dim price = 0
    ' Not valid, because Price and price are the same name.
    ' Dim anon7 = New With {Key product.Price, Key price}
    
  • Den ursprungliga typen och värdet för en egenskap beror på en annan egenskap som ännu inte har upprättats. Är till exempel .IDName = .LastName inte giltigt i en anonym typdeklaration om inte .LastName redan har initierats.

    ' Not valid.
    ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
    

    I det här exemplet kan du åtgärda problemet genom att återställa ordningen där egenskaperna deklareras.

    ' Valid.
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • Ett egenskapsnamn för den anonyma typen är samma som namnet på en medlem i Object. Följande deklaration misslyckas till exempel eftersom Equals är en metod för Object.

    ' Not valid.
    ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _
    '                       "greater than", Key .Less = "less than"}
    

    Du kan åtgärda problemet genom att ändra egenskapsnamnet:

    ' Valid 
    Dim relationsLabels2 = New With {Key .EqualString = "equals",
                                     Key .GreaterString = "greater than",
                                     Key .LessString = "less than"}
    

Se även