Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Jenis anonim tidak menyediakan mekanisme untuk secara langsung menentukan jenis data properti. Jenis semua properti disimpulkan. Dalam contoh berikut, jenis Name
dan Price
disimpulkan langsung dari nilai yang digunakan untuk menginisialisasinya.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Jenis anonim juga dapat menyimpulkan nama dan jenis properti dari sumber lain. Bagian berikut memberikan daftar keadaan di mana inferensi dimungkinkan, dan contoh situasi di mana tidak.
Inferensi berhasil
Jenis anonim dapat menyimpulkan nama dan jenis properti dari sumber berikut:
Dari nama variabel. Jenis
anonProduct
anonim akan memiliki dua properti,productName
danproductPrice
. Jenis data mereka akan menjadi variabel asli,String
danDouble
, masing-masing.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}
Dari properti atau nama bidang objek lain. Misalnya, pertimbangkan sebuah objek tipe
car
yang memiliki propertiCarClass
danName
. Untuk membuat instans jenis anonim baru,car1
, dengan propertiName
danID
yang diinisialisasi dengan nilai dari objekcar
, Anda dapat menulis yang berikut:Dim car1 = New With {Key car.Name, Key car.ID}
Deklarasi sebelumnya setara dengan baris kode yang lebih panjang yang menentukan jenis
car2
anonim .Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
Dari nama anggota XML.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
Jenis yang dihasilkan untuk
anon
akan memiliki satu properti,Book
, dari jenis IEnumerable(Dari XElement).Dari fungsi yang tidak memiliki parameter, seperti
SomeFunction
dalam contoh berikut.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}
Variabel
anon2
dalam kode berikut adalah jenis anonim yang memiliki satu properti, karakter bernamaFirst
. Kode ini akan menampilkan huruf "E," huruf yang dikembalikan oleh fungsi 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)
Kegagalan Inferensi
Inferensi nama akan gagal dalam banyak keadaan, termasuk yang berikut ini:
Inferensi berasal dari pemanggilan metode, konstruktor, atau properti berparameter yang memerlukan argumen. Deklarasi
anon1
sebelumnya gagal jikasomeFunction
memiliki satu atau beberapa argumen.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}
Pemberian nama properti baru memecahkan masalah.
' Valid. Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
Inferensi berasal dari ekspresi kompleks.
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}
Kesalahan dapat diatasi dengan menetapkan hasil ekspresi ke nama properti.
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}
Inferensi untuk beberapa properti menghasilkan dua properti atau lebih yang memiliki nama yang sama. Merujuk kembali ke deklarasi dalam contoh sebelumnya, Anda tidak dapat mencantumkan baik
product.Name
maupuncar1.Name
sebagai properti dari tipe anonim yang sama. Ini karena pengidentifikasi yang disimpulkan untuk masing-masing adalahName
.' Not valid. ' Dim anon5 = New With {Key product.Name, Key car1.Name}
Masalah dapat diselesaikan dengan menetapkan nilai ke nama properti yang berbeda.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
Perhatikan bahwa perubahan dalam kasus (perubahan antara huruf besar dan huruf kecil) tidak membuat dua nama berbeda.
Dim price = 0 ' Not valid, because Price and price are the same name. ' Dim anon7 = New With {Key product.Price, Key price}
Jenis awal dan nilai satu properti tergantung pada properti lain yang belum ditetapkan. Misalnya,
.IDName = .LastName
tidak valid dalam deklarasi jenis anonim kecuali.LastName
sudah diinisialisasi.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
Dalam contoh ini, Anda dapat memperbaiki masalah dengan mengembalikan urutan di mana properti dideklarasikan.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
Nama properti dari jenis anonim sama dengan nama anggota Object. Misalnya, deklarasi berikut gagal karena
Equals
merupakan metode .Object' Not valid. ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _ ' "greater than", Key .Less = "less than"}
Anda dapat memperbaiki masalah dengan mengubah nama properti:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}