Delen via


Procedure: Eigenschapsnamen en -typen afleiden in anonieme typedeclaraties (Visual Basic)

Anonieme typen bieden geen mechanisme voor het rechtstreeks opgeven van de gegevenstypen van eigenschappen. Typen van alle eigenschappen worden afgeleid. In het volgende voorbeeld worden de typen Name en Price deze rechtstreeks afgeleid van de waarden die worden gebruikt om ze te initialiseren.

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

Anonieme typen kunnen ook eigenschapsnamen en -typen afleiden uit andere bronnen. De volgende secties bevatten een lijst met de omstandigheden waar deductie mogelijk is en voorbeelden van situaties waarin dit niet het geval is.

Geslaagde deductie

Anonieme typen kunnen eigenschapsnamen en -typen afleiden uit de volgende bronnen:

  • Van namen van variabelen. Anoniem type anonProduct heeft twee eigenschappen en productNameproductPrice. Hun gegevenstypen zijn respectievelijk die van de oorspronkelijke variabelen String en Double, respectievelijk.

    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}
    
  • Van eigenschaps- of veldnamen van andere objecten. Denk bijvoorbeeld aan een car object van een CarClass type dat eigenschappen bevat en ID bevatName. Als u een nieuw anoniem typeexemplaren wilt maken, car1met Name en ID eigenschappen die zijn geïnitialiseerd met de waarden van het car object, kunt u het volgende schrijven:

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

    De vorige declaratie is gelijk aan de langere coderegel die anoniem type car2definieert.

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • Van XML-lidnamen.

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

    Het resulterende type heeft anon één eigenschap, Bookvan het type IEnumerable(van XElement).

  • Van een functie die geen parameters heeft, zoals SomeFunction in het volgende voorbeeld.

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

    De variabele anon2 in de volgende code is een anoniem type met één eigenschap, een teken met de naam First. Met deze code wordt een letter 'E' weergegeven, de letter die door de functie Firstwordt geretourneerd.

    Dim aString As String = "Example String"
    Dim anon2 = New With {Key aString.First()}
    ' The variable anon2 has one property, First.
    Console.WriteLine(anon2.First)
    

Deductiefouten

Naamdeductie mislukt in veel gevallen, waaronder de volgende:

  • De deductie is afgeleid van de aanroep van een methode, een constructor of een geparameteriseerde eigenschap waarvoor argumenten zijn vereist. De vorige declaratie van anon1 mislukt als someFunction er een of meer argumenten zijn.

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

    Toewijzing aan een nieuwe eigenschapsnaam lost het probleem op.

    ' Valid.
    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
    
  • De deductie is afgeleid van een complexe expressie.

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

    De fout kan worden opgelost door het resultaat van de expressie toe te wijzen aan een eigenschapsnaam.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • Deductie voor meerdere eigenschappen produceert twee of meer eigenschappen met dezelfde naam. Als u terugwijst naar declaraties in eerdere voorbeelden, kunt u zowel product.Name als car1.Name als eigenschappen van hetzelfde anonieme type niet weergeven. Dit komt doordat de uitgestelde id voor elk van deze zou zijn Name.

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

    Het probleem kan worden opgelost door de waarden toe te wijzen aan afzonderlijke eigenschapsnamen.

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

    Houd er rekening mee dat wijzigingen in het geval (wijzigingen tussen hoofdletters en kleine letters) geen twee namen onderscheiden.

    Dim price = 0
    ' Not valid, because Price and price are the same name.
    ' Dim anon7 = New With {Key product.Price, Key price}
    
  • Het oorspronkelijke type en de waarde van de ene eigenschap zijn afhankelijk van een andere eigenschap die nog niet tot stand is gebracht. Is bijvoorbeeld .IDName = .LastName niet geldig in een anonieme typedeclaratie, tenzij .LastName deze al is geïnitialiseerd.

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

    In dit voorbeeld kunt u het probleem oplossen door de volgorde te wijzigen waarin de eigenschappen worden gedeclareerd.

    ' Valid.
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • Een eigenschapsnaam van het anonieme type is hetzelfde als de naam van een lid van Object. De volgende declaratie mislukt bijvoorbeeld omdat Equals dit een methode is van Object.

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

    U kunt het probleem oplossen door de naam van de eigenschap te wijzigen:

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

Zie ook