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 iproductPrice
productName
. Ich typy danych będą takie jak oryginalne zmienne iString
Double
, 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
obiektCarClass
typu, który zawieraName
właściwości iID
. Aby utworzyć nowe wystąpienie typu anonimowego,car1
z właściwościamiName
iID
zainicjowanymi przy użyciu wartości zcar
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
car2
anonimowy .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ść ,Book
typu 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 nazwieFirst
. 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ślisomeFunction
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 icar1.Name
jako właściwości tego samego typu anonimowego. Jest to spowodowane tym, że wywnioskowany identyfikator dla każdego z nich toName
.' 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"}