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.
Artikel ini membahas kesalahan pengkompilasi berikut:
-
CS1962: Operator
typeoftidak dapat digunakan pada jenis.dynamic - CS1964: Tidak dapat menerapkan konversi dinamis ke ekspresi.
-
CS1965: Tidak dapat diturunkan dari tipe
dynamic. - CS1966: Tidak dapat berasal dari jenis dinamis yang dibangun.
-
CS1967: Tidak dapat menggunakan
dynamicjenis sebagai batasan jenis. - CS1968: Tidak dapat menggunakan jenis dinamis yang dibangun sebagai batasan jenis.
- CS1969: Satu atau beberapa jenis yang diperlukan untuk mengkompilasi ekspresi dinamis tidak dapat ditemukan.
-
CS1970: Jangan gunakan '
System.Runtime.CompilerServices.DynamicAttribute'. Gunakan kata kunci 'dynamic' sebagai gantinya. - CS1971: Panggilan ke anggota perlu dikirim secara dinamis, tetapi tidak bisa karena merupakan bagian dari ekspresi akses dasar. Pertimbangkan untuk melemparkan argumen dinamis atau menghilangkan akses dasar.
- CS1972: Akses pengindeks perlu dikirim secara dinamis, tetapi tidak bisa karena merupakan bagian dari ekspresi akses dasar. Pertimbangkan untuk melemparkan argumen dinamis atau menghilangkan akses dasar.
- CS1973: Jenis argumen dinamis tidak cocok dengan jenis parameter target untuk metode ekstensi.
- CS1974: Pengiriman dinamis ke metode bersyarat akan gagal pada runtime.
- CS1975: Panggilan konstruktor perlu dikirim secara dinamis, tetapi tidak bisa karena merupakan bagian dari inisialisasi konstruktor. Pertimbangkan untuk melemparkan argumen dinamis.
- CS1976: Tidak dapat menggunakan grup metode sebagai argumen ke operasi yang dikirim secara dinamis.
- CS1977: Tidak dapat menggunakan ekspresi lambda sebagai argumen ke operasi yang dikirim secara dinamis.
- CS1978: Tidak dapat menggunakan ekspresi sebagai argumen ke operasi yang dikirim secara dinamis.
- CS1979: Ekspresi kueri dengan urutan sumber atau gabungan jenis dinamis tidak diperbolehkan.
- CS1980: Tidak dapat menentukan kelas atau anggota yang menggunakan 'dinamis' karena jenis kompilator yang diperlukan hilang.
-
CS1981: Pola '
is dynamic' menyesatkan. Gunakan 'is object' sebagai gantinya. -
CS7083: Ekspresi harus secara implisit dapat dikonversi ke '
System.Object', atau jenis 'dynamic' tidak tersedia. - CS8133: Tidak dapat mendekonstruksi objek dinamis.
-
CS8364: Argumen ke '
nameof' tidak dapat menggunakan operasi dinamis apa pun. - CS8416: Pengubah asinkron tidak dapat digunakan dalam ekspresi atribut dinamis.
- CS9230: Tidak dapat melakukan pemanggilan dinamis pada ekspresi dengan jenis.
Menggunakan dynamic dalam deklarasi tipe dan batasannya
-
CS1962: Operator typeof tidak dapat digunakan pada jenis
dynamic. -
CS1965: Tidak dapat berasal dari
dynamicjenis . - CS1966: Tidak dapat berasal dari tipe dinamis terkontruksi.
-
CS1967: Tidak dapat menggunakan
dynamicjenis sebagai batasan jenis. - CS1968: Tidak dapat menggunakan jenis dinamis yang dibangun sebagai batasan jenis.
-
CS1970: Jangan gunakan '
System.Runtime.CompilerServices.DynamicAttribute'. Gunakan kata kunci 'dynamic' sebagai gantinya.
Jenis ini dynamic menyediakan pengikatan terlambat untuk operasi pada runtime. Gunakan tipe konkret dalam konteks di mana kompiler membutuhkan informasi tipe pada waktu kompilasi, seperti deklarasi tipe, batasan, pewarisan, atau operasi refleksi.
- Gunakan tipe konkret untuk operasi refleksi. Gunakan jenis tertentu alih-alih
dynamicdengantypeofoperator (CS1962) - Gunakan jenis konkret untuk pewarisan. Tentukan kelas dasar beton alih-alih
dynamic(CS1965, CS1966): - Gunakan batasan jenis beton. Tentukan batasan jenis beton pada parameter generik alih-alih
dynamic(CS1967, CS1968): -
dynamicGunakan kata kunci untuk variabel. Selalu gunakandynamickata kunci untuk mendeklarasikan variabel dinamis. Jangan terapkanDynamicAttributesecara langsung (CS1970):
Untuk informasi selengkapnya tentang dynamic jenis dan cara penggunaannya, lihat Menggunakan jenis dinamis.
Pembatasan operasi dinamis
- CS1964: Tidak dapat menerapkan konversi dinamis ke ekspresi.
- CS1971: Panggilan ke anggota perlu dikirim secara dinamis, tetapi tidak bisa karena merupakan bagian dari ekspresi akses dasar. Pertimbangkan untuk melemparkan argumen dinamis atau menghilangkan akses dasar.
- CS1972: Akses pengindeks perlu dikirim secara dinamis, tetapi tidak bisa karena merupakan bagian dari ekspresi akses dasar. Pertimbangkan untuk melemparkan argumen dinamis atau menghilangkan akses dasar.
- CS1973: Jenis argumen dinamis tidak cocok dengan jenis parameter target untuk metode ekstensi.
- CS1975: Panggilan konstruktor perlu dikirim secara dinamis, tetapi tidak bisa karena merupakan bagian dari inisialisasi konstruktor. Pertimbangkan untuk melemparkan argumen dinamis.
- CS1976: Tidak dapat menggunakan grup metode sebagai argumen ke operasi yang dikirim secara dinamis.
- CS1977: Tidak dapat menggunakan ekspresi lambda sebagai argumen ke operasi yang dikirim secara dinamis.
- CS1978: Tidak dapat menggunakan ekspresi sebagai argumen ke operasi yang dikirim secara dinamis.
- CS1979: Ekspresi kueri dengan sumber atau urutan gabungan bertipe dinamis tidak diperbolehkan.
- CS8133: Tidak dapat mendekonstruksi objek dinamis.
-
CS8364: Argumen ke '
nameof' tidak dapat menggunakan operasi dinamis apa pun. - CS8416: Pengubah asinkron tidak dapat digunakan dalam ekspresi atribut dinamis.
- CS9230: Tidak dapat melakukan pemanggilan dinamis pada ekspresi dengan jenis.
Meskipun pengikatan dinamis memberikan fleksibilitas pada runtime, ubah nilai dinamis ke jenis tertentu saat Anda memerlukan informasi jenis pada saat kompilasi untuk operasi tertentu.
Transmisikan argumen dinamis sebelum memanggil anggota dasar: Transmisikan argumen dinamis ke jenis tertentu sebelum memanggil anggota dasar, pengindeks, atau konstruktor (CS1971, CS1972, CS1975):
class Base { public virtual void Method(object obj) { } public virtual int this[int index] => 0; public Base(int value) { } } class Derived : Base { public Derived(dynamic value) : base((int)value) { } // Cast before calling base constructor public override void Method(object obj) { dynamic d = obj; base.Method((object)d); // Cast before calling base method } public override int this[int index] { get { dynamic d = index; return base[(int)d]; // Cast before accessing base indexer } } }Meneruskan ke tipe tertentu sebelum meneruskan delegasi atau lambda: Meneruskan objek dinamis ke tipe konkretnya sebelum meneruskan grup metode, ekspresi lambda, atau delegasi (CS1976, CS1977, CS1978):
dynamic d = GetDynamicObject(); // Avoid: d.ProcessData(Console.WriteLine); // CS1976 d.ProcessData(x => x * 2); // CS1977 // Recommended: ((IProcessor)d).ProcessData(Console.WriteLine); // Cast first ((IProcessor)d).ProcessData(x => x * 2); // Cast firstGunakan tipe konkret untuk kueri LINQ: Gunakan tipe konkret sebagai ganti
dynamicuntuk sumber kueri LINQ dan join sequence (CS1979):dynamic data = GetData(); // Avoid: var query = from item in data // CS1979 select item; // Recommended: IEnumerable<MyType> typedData = data; var query = from item in typedData select item;Akses elemen tuple satu per satu: Akses elemen tuple satu per satu alih-alih menggunakan dekonstruksi dengan tuple dinamis (CS8133):
dynamic tuple = (1, 2); // Avoid: var (a, b) = tuple; // CS8133 // Recommended: var a = tuple.Item1; var b = tuple.Item2;Gunakan ekspresi waktu kompilasi untuk operasi yang memerlukan informasi tipe: Gunakan tipe konkret untuk operasi yang memerlukan informasi tipe waktu kompilasi (CS1964, CS1973, CS8364, CS8416, CS9230):
dynamic value = GetValue(); // Avoid: var name = nameof(value.Property); // CS8364 // Recommended: MyType typedValue = value; var name = nameof(typedValue.Property); // Use concrete type
Untuk informasi selengkapnya tentang pengikatan dinamis dan batasannya, lihat Menggunakan jenis dinamis.
Dukungan runtime yang hilang untuk pemrograman dinamis
- CS1969: Satu atau beberapa jenis yang diperlukan untuk mengkompilasi ekspresi dinamis tidak dapat ditemukan. Apakah Anda kehilangan referensi ke 'Microsoft.CSharp.dll'?
- CS1980: Tidak dapat menentukan kelas atau anggota yang menggunakan 'dinamis' karena jenis kompilator yang diperlukan tidak dapat ditemukan. Apakah Anda kehilangan referensi?
-
CS7083: Ekspresi harus secara implisit dapat dikonversi ke '
System.Object', atau jenis 'dynamic' tidak tersedia.
Pengkompilasi membutuhkan tipe dari namespace System.Runtime dan Dynamic Language Runtime (DLR) untuk menghasilkan kode untuk operasi dinamis (CS1969, CS1980, CS7083). Pastikan proyek Anda menyertakan referensi yang diperlukan. Jenis yang diperlukan disertakan dalam semua proyek .NET (.NET 5 dan yang lebih baru) modern. Untuk proyek .NET Framework, tambahkan referensi ke Microsoft.CSharp.dll dalam file proyek Anda.
Untuk informasi selengkapnya tentang persyaratan jenis dinamis, lihat Menggunakan jenis dinamis.
Peringatan pengiriman dinamis
- CS1974: Panggilan ke metode yang dikirim secara dinamis dapat gagal pada run-time karena satu atau beberapa kelebihan beban yang berlaku adalah metode kondisional.
-
CS1981: Pola '
is dynamic' menyesatkan. Jenis runtime subekspresi tidak pernah 'dynamic'. Pertimbangkan untuk menggunakan 'object' sebagai gantinya.
Saat Anda memanggil metode yang memiliki [Conditional] atribut , hindari menggunakan pengiriman dinamis. Pengkompilasi tidak dapat memverifikasi atribut metode bersyarat dengan pengikatan dinamis, yang dapat menyebabkan kegagalan runtime (CS1974). Transmisikan ekspresi dinamis ke jenis aktualnya terlebih dahulu:
dynamic d = GetObject();
// Avoid:
d.ConditionalMethod(); // CS1974 - can fail at runtime
// Recommended:
MyClass obj = (MyClass)d;
obj.ConditionalMethod(); // Compile-time checks ensure correctness
Saat Anda memeriksa apakah nilai non-null, gunakan is object alih-alih is dynamic. Kata kunci dynamic adalah konstruksi waktu kompilasi, dan tidak ada tipe runtime objek yang pernah dynamic (CS1981):
// Avoid:
if (someValue is dynamic) // CS1981 - always evaluates to false
{
// This code never executes
}
// Recommended:
if (someValue is object) // Correctly checks if non-null
{
// This code executes for non-null values
}
Untuk informasi selengkapnya tentang pengiriman dinamis dan perilaku runtime, lihat Menggunakan jenis dinamis.