Porady: wnioskowanie nazw właściwości i typów w deklaracjach typu anonimowego (Visual Basic)

Typy anonimowe nie zapewniają żadnego mechanizmu bezpośredniego określania typów danych właściwości. Typy wszystkich właściwości są wnioskowane. W poniższym przykładzie typy Name i Price są wnioskowane bezpośrednio z wartości używanych do ich inicjowania.

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

Typy anonimowe mogą również wywnioskować nazwy właściwości i typy z innych źródeł. Poniższe sekcje zawierają listę okoliczności, w których wnioskowanie jest możliwe, oraz przykłady sytuacji, w których nie jest.

Pomyślne wnioskowanie

Typy anonimowe mogą wywnioskować nazwy właściwości i typy z następujących źródeł:

  • Z nazw zmiennych. Typ anonProduct anonimowy będzie miał dwie właściwości i productPriceproductName . Ich typy danych będą takie jak oryginalne zmienne i StringDouble, odpowiednio.

    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}
    
  • Z nazw właściwości lub pól innych obiektów. Rozważmy na przykład car obiekt CarClass typu, który zawiera Name właściwości i ID . Aby utworzyć nowe wystąpienie typu anonimowego, car1z właściwościami Name i ID zainicjowanymi przy użyciu wartości z car obiektu, możesz napisać następujące elementy:

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

    Poprzednia deklaracja jest równoważna dłuższemu wierszowi kodu, który definiuje typ car2anonimowy .

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • Z nazw elementów członkowskich XML.

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

    Wynikowy typ dla anon elementu ma jedną właściwość , Booktypu IEnumerable(Of XElement).

  • Z funkcji, która nie ma parametrów, takich jak SomeFunction w poniższym przykładzie.

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

    Zmienna anon2 w poniższym kodzie jest typem anonimowym, który ma jedną właściwość, znak o nazwie First. Ten kod wyświetli literę "E", literę zwracaną przez funkcję 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)
    

Błędy wnioskowania

Wnioskowanie nazwy zakończy się niepowodzeniem w wielu okolicznościach, w tym w następujących sytuacjach:

  • Wnioskowanie pochodzi z wywołania metody, konstruktora lub sparametryzowanej właściwości, która wymaga argumentów. Poprzednia deklaracja błędu kończy się niepowodzeniem anon1 , jeśli someFunction ma co najmniej jeden argument.

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

    Przypisanie do nowej nazwy właściwości rozwiązuje problem.

    ' Valid.
    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
    
  • Wnioskowanie pochodzi z wyrażenia złożonego.

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

    Błąd można rozwiązać, przypisując wynik wyrażenia do nazwy właściwości.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • Wnioskowanie dla wielu właściwości powoduje utworzenie co najmniej dwóch właściwości o tej samej nazwie. Odwołując się z powrotem do deklaracji we wcześniejszych przykładach, nie można wyświetlić listy zarówno, product.Name jak i car1.Name jako właściwości tego samego typu anonimowego. Jest to spowodowane tym, że wywnioskowany identyfikator dla każdego z nich to Name.

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

    Problem można rozwiązać, przypisując wartości do odrębnych nazw właściwości.

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

    Należy pamiętać, że zmiany w przypadku (zmiany między wielkimi i małymi literami) nie tworzą dwóch nazw odrębnych.

    Dim price = 0
    ' Not valid, because Price and price are the same name.
    ' Dim anon7 = New With {Key product.Price, Key price}
    
  • Początkowy typ i wartość jednej właściwości zależą od innej właściwości, która nie została jeszcze ustanowiona. Na przykład jest nieprawidłowy w deklaracji typu anonimowego, .IDName = .LastName chyba że .LastName został już zainicjowany.

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

    W tym przykładzie można rozwiązać ten problem, odwracając kolejność deklarowania właściwości.

    ' Valid.
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • Nazwa właściwości typu anonimowego jest taka sama jak nazwa elementu członkowskiego .Object Na przykład następująca deklaracja kończy się niepowodzeniem, ponieważ Equals jest metodą Object.

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

    Problem można rozwiązać, zmieniając nazwę właściwości:

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

Zobacz też