Útmutató: Tulajdonságnevek és -típusok következtetése névtelen típusdeklarációkban (Visual Basic)
A névtelen típusok nem biztosítják a tulajdonságok adattípusainak közvetlen megadására szolgáló mechanizmust. A rendszer az összes tulajdonság típusára következtet. Az alábbi példában az inicializálásukhoz használt értékekből következtetünk a típusokra Name
, és Price
azokra közvetlenül következtetünk.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
A névtelen típusok más forrásokból is következtethetnek a tulajdonságnevekre és -típusokra. Az alábbi szakaszok felsorolják azokat a körülményeket, amelyekből következtetés lehetséges, és példákat azokra a helyzetekre, amikor nem.
Sikeres következtetés
A névtelen típusok a következő forrásokból következtethetnek a tulajdonságnevekre és -típusokra:
Változónevekből. A névtelen típus
anonProduct
két tulajdonsággalproductName
productPrice
és . Az adattípusuk az eredeti változóké lesz,String
illetveDouble
azoké.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}
Más objektumok tulajdonság- vagy mezőnevéből. Vegyük például egy
car
olyan típusú objektumotCarClass
, amely tartalmaz ésID
tulajdonságokat isName
tartalmaz. Ha új névtelen típusú példányt szeretne létrehozni azcar1
Name
ID
objektum értékeivelcar
inicializálva, a következőket írhatja:Dim car1 = New With {Key car.Name, Key car.ID}
Az előző deklaráció egyenértékű a névtelen típust
car2
meghatározó hosszabb kódsorsal.Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
XML-tagok neveiből.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
Az eredményül kapott típusnak
anon
egy tulajdonsága lenne,Book
típusa IEnumerable(XElement).Olyan függvényből, amely nem rendelkezik paraméterekkel, például
SomeFunction
az alábbi példában.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}
A következő kódban szereplő változó
anon2
egy névtelen típus, amelynek egy tulajdonsága van, egy karakter neveFirst
. Ez a kód egy "E" betűt jelenít meg, a függvény Firstáltal visszaadott betűt.Dim aString As String = "Example String" Dim anon2 = New With {Key aString.First()} ' The variable anon2 has one property, First. Console.WriteLine(anon2.First)
Következtetési hibák
A névkövetkeztetés számos esetben sikertelen lesz, beleértve a következőket:
A következtetés egy metódus, konstruktor vagy paraméteres tulajdonság argumentumokat igénylő meghívásából származik. Az előző deklaráció
anon1
meghiúsul, hasomeFunction
egy vagy több argumentuma van.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}
Az új tulajdonságnévhez való hozzárendelés megoldja a problémát.
' Valid. Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
A következtetés egy összetett kifejezésből származik.
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}
A hiba úgy oldható meg, hogy a kifejezés eredményét egy tulajdonságnévhez rendeli.
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}
Több tulajdonság következtetése két vagy több azonos nevű tulajdonságot eredményez. A korábbi példákban szereplő deklarációkra hivatkozva nem listázhatja az
product.Name
azonos névtelen típusú tulajdonságokat éscar1.Name
tulajdonságokat. Ennek az az oka, hogy mindegyikhez a következtetési azonosító tartozikName
.' Not valid. ' Dim anon5 = New With {Key product.Name, Key car1.Name}
A probléma megoldható úgy, hogy az értékeket különböző tulajdonságnevekhez rendeli.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
Vegye figyelembe, hogy a kis- és nagybetűk közötti változások nem különböztetik meg a két nevet.
Dim price = 0 ' Not valid, because Price and price are the same name. ' Dim anon7 = New With {Key product.Price, Key price}
Az egyik tulajdonság kezdeti típusa és értéke egy még nem létrehozott tulajdonságtól függ. Például nem érvényes névtelen típusdeklarációban, kivéve,
.IDName = .LastName
ha.LastName
már inicializálva van.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
Ebben a példában a problémát a tulajdonságok deklarálási sorrendjének megfordításával háríthatja el.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
A névtelen típusú tulajdonságnév megegyezik a tag Objectnevével. A következő deklaráció például meghiúsul, mert
Equals
a metódus a következő Object.' Not valid. ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _ ' "greater than", Key .Less = "less than"}
A problémát a tulajdonság nevének módosításával háríthatja el:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}