Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Anonyma typer ger ingen mekanism för att direkt ange datatyperna för egenskaper. Typerna för alla egenskaper infereras. 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 inferens
Anonyma typer kan härleda egenskapsnamn och typer från följande källor:
Från variabelnamn. Anonym typ
anonProducthar två egenskaper ochproductNameproductPrice. Deras datatyper är de ursprungliga variablernaStringrespektiveDouble.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
carobjekt av enCarClasstyp som innehållerNameochIDegenskaper. Om du vill skapa en ny instans av anonym typ,car1, medNameochIDegenskaper som initieras med värdena fråncarobjektet, 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
anonskulle ha en egenskap,Book, av typen IEnumerable(Av XElement).Från en funktion som inte har några parametrar, till exempel
SomeFunctioni följande exempel.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}Variabeln
anon2i följande kod är en anonym typ som har en egenskap, ett tecken med namnetFirst. 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)
Slutledningsfel
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
anon1misslyckas om det finns ett eller flera argument isomeFunction.' 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.Nameochcar1.Namesom egenskaper av samma anonyma typ. Det beror på att den härledda identifieraren för var och en av dessa skulle varaName.' 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 bokstavsform (ändringar mellan versaler och gemener) inte gör två namn åtskilda.
Dim price = 0 ' Not valid, because Price and price are the same name. ' Dim anon7 = New With {Key product.Price, Key price}Den inledande typen och värdet för en egenskap är beroende av en annan egenskap som ännu inte har fastställts. Är till exempel
.IDName = .LastNameinte giltigt i en anonym typdeklaration om inte.LastNameredan 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"}