Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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"}