Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Анонимные типы не предоставляют механизм прямого указания типов данных свойств. Типы всех свойств выводятся. В следующем примере типы 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"}