Megosztás a következőn keresztül:


Ú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ággal productNameproductPriceés . Az adattípusuk az eredeti változóké lesz, String illetve Doubleazoké.

    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 és ID tulajdonságokat is Name tartalmaz. Ha új névtelen típusú példányt szeretne létrehozni az car1NameID objektum értékeivel car 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 car2meghatá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, Booktí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 neve First. 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, ha someFunction 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 és car1.Name tulajdonságokat. Ennek az az oka, hogy mindegyikhez a következtetési azonosító tartozik Name.

    ' 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"}
    

Lásd még