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 ochproductName
productPrice
. Deras datatyper är de ursprungliga variablernaString
respektiveDouble
.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 enCarClass
typ som innehållerName
ochID
egenskaper. Om du vill skapa en ny instans av anonym typ,car1
, medName
ochID
egenskaper som initieras med värdena fråncar
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 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)
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 omsomeFunction
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
ochcar1.Name
som 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 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"}