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