Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Анонимные типы не предоставляют механизм прямого указания типов данных свойств. Типы всех свойств выводятся. В следующем примере типы Name и Price выводятся непосредственно из значений, которые используются для их инициализации.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Анонимные типы также могут выводить имена и типы свойств из других источников. В следующих разделах приведен список обстоятельств, в которых возможно вывод, и примеры ситуаций, в которых это не так.
Успешный вывод
Анонимные типы могут выводить имена и типы свойств из следующих источников:
Из имен переменных. Анонимный тип
anonProductбудет иметь два свойства,productNameиproductPrice. Их типы данных будут иметь исходные переменныеStringиDoubleсоответственно.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}Из имен свойств или полей других объектов. Например, рассмотрим
carобъектCarClassтипа, который включаетNameиIDсвойства. Чтобы создать новый экземпляр анонимного типа,car1, с свойствамиNameиID, инициализированными значениями из объектаcar, можно написать следующее:Dim car1 = New With {Key car.Name, Key car.ID}Предыдущее объявление эквивалентно длинной строке кода, определяющей анонимный тип
car2.Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}Из имен участников XML.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}Результирующий тип для
anonбудет иметь одно свойство,Book, типа IEnumerable(Of XElement).Из функции, которая не имеет параметров, например
SomeFunctionв следующем примере.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}Переменная
anon2в следующем коде представляет собой анонимный тип, имеющий одно свойство, символ с именемFirst. Этот код будет отображать букву E, возвращаемую функцией 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)
Ошибки вывода
Определение имен может потерпеть неудачу во многих случаях, включая следующие:
Вывод является производным от вызова метода, конструктора или параметризованного свойства, требующего аргументов. Предыдущее объявление завершается ошибкой
anon1, еслиsomeFunctionимеет один или несколько аргументов.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}Назначение новому имени свойства решает проблему.
' Valid. Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}Вывод является производным от сложного выражения.
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}Эту ошибку можно устранить, назначив результат выражения имени свойства.
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}Вывод для нескольких свойств создает два или более свойства с одинаковым именем. Ссылаясь на объявления в предыдущих примерах, нельзя перечислить оба
product.Nameиcar1.Nameкак свойства одного и того же анонимного типа. Это связано с тем, что выводимый идентификатор для каждого из них будетName.' Not valid. ' Dim anon5 = New With {Key product.Name, Key car1.Name}Проблему можно решить, назначив значения отдельным именам свойств.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}Обратите внимание, что изменения регистра (различия между прописными и строчными буквами) не делают два имени различными.
Dim price = 0 ' Not valid, because Price and price are the same name. ' Dim anon7 = New With {Key product.Price, Key price}Исходный тип и значение одного свойства зависит от другого свойства, которое еще не установлено. Например,
.IDName = .LastNameнедопустимо в объявлении анонимного типа, если.LastNameуже не инициализировано.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}В этом примере можно устранить проблему, отменив порядок объявления свойств.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}Имя свойства анонимного типа совпадает с именем члена Object. Например, следующее объявление ошибочно, так как
Equalsявляется методом Object.' Not valid. ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _ ' "greater than", Key .Less = "less than"}Чтобы устранить проблему, измените имя свойства:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}