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:
-
CS1983: Karena ini adalah metode asinkron, ekspresi pengembalian harus berjenis '
T' daripada 'Task<T>'. - CS1985: Tidak dapat menggunakan 'await' dalam klausa catch.
-
CS1986: '
await' mengharuskan jenis memiliki metode 'GetAwaiter'yang cocok. - CS1989: Ekspresi lambda asinkron tidak dapat dikonversi ke pohon ekspresi.
- CS1991: 'Type' tidak dapat menerapkan 'event' karena merupakan peristiwa Windows Runtime dan 'event' adalah peristiwa .NET biasa.
-
CS1992: Operator '
await' hanya dapat digunakan saat dimuat dalam metode atau ekspresi lambda yang ditandai dengan pengubah 'asinkron'. -
CS1994: Pengubah '
async' hanya dapat digunakan dalam metode yang memiliki tubuh. -
CS1995: Operator '
await' hanya dapat digunakan dalam ekspresi kueri dalam ekspresi koleksi pertama dari klausa 'from' awal atau dalam ekspresi koleksi klausa ''join. - CS1996: Tidak dapat menunggu dalam isi pernyataan kunci.
- CS1997: Karena fungsi adalah metode asinkron yang mengembalikan nilai, kata kunci pengembalian tidak boleh diikuti oleh ekspresi objek.
-
CS1998: Metode asinkron ini tidak memiliki operator '
await' dan akan berjalan secara sinkron. Pertimbangkan untuk menggunakan operator 'await' untuk menunggu panggilan API non-pemblokiran, atau 'await Task.Run(...)' untuk melakukan pekerjaan terikat CPU pada utas latar belakang. - CS4001: Tidak dapat menunggu ekspresi.
-
CS4003: '
await' tidak dapat digunakan sebagai pengidentifikasi dalam metode asinkron atau ekspresi lambda. - CS4005: Metode asinkron tidak dapat memiliki parameter jenis pointer.
- CS4006: __arglist tidak diizinkan dalam daftar parameter metode asinkron.
-
CS4007: Instans dari jenis ini tidak dapat dipertahankan di seluruh batasan '
await' atau 'yield'. -
CS4008: Tidak dapat menunggu '
void'. - CS4009: Titik masuk yang mengembalikan void atau int tidak dapat asinkron.
- CS4010: Tidak dapat mengonversi ekspresi asinkron ke tipe delegasi. Ekspresi asinkron mungkin mengembalikan void, Task, atau Task<T>, yang semuanya tidak dapat dikonversi ke tipe apapun.
-
CS4011: '
await' mengharuskan jenis pengembalian '{1}. GetAwaiter()' memiliki anggota 'IsCompleted', 'OnCompleted', dan 'GetResult' yang cocok, dan menerapkan 'INotifyCompletion' atau 'ICriticalNotifyCompletion'. - CS4012: Parameter jenis tidak dapat dideklarasikan dalam metode asinkron atau ekspresi lambda asinkron.
-
CS4014: Karena panggilan ini tidak ditunggu, eksekusi metode saat ini berlanjut sebelum panggilan selesai. Pertimbangkan untuk menerapkan
awaitoperator ke hasil panggilan. - CS4015: 'MethodImplOptions.Synchronized' tidak dapat diterapkan ke metode asinkron.
- CS4016: Karena ini adalah metode asinkron, ekspresi pengembalian harus berjenis tugas seperti jenis daripada jenis yang dideklarasikan.
- CS4027: Jenis ekspresi belum mengimplementasikan anggota yang diharuskan.
-
CS4028: '
await' mengharuskan tipe memiliki metode 'GetAwaiter' yang sesuai. Apakah Anda melewatkan direktif penggunaan untuk 'System'? - CS4029: Tidak dapat mengembalikan ekspresi jenis 'void'.
- CS4030: Atribut keamanan tidak dapat diterapkan ke metode Asinkron.
- CS4031: Metode asinkron tidak diizinkan dalam Antarmuka, Kelas, atau Struktur yang memiliki atribut 'SecurityCritical' atau 'SecuritySafeCritical'.
-
CS4032: Operator '
await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'asinkron' dan mengubah jenis pengembaliannya menjadi 'Task<T>'. -
CS4033: Operator '
await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'async' dan mengubah jenis pengembaliannya menjadi 'Task'. -
CS4034: Operator '
await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'asinkron'. - CS8031: Ekspresi lambda asinkron yang dikonversi ke delegasi yang mengembalikan tugas tidak dapat mengembalikan nilai.
-
CS8100: Operator '
await' tidak dapat digunakan dalam penginisialisasi variabel skrip statis. - CS8177: Metode asinkron tidak dapat memiliki variabel lokal by-reference.
-
CS8178: Referensi yang dikembalikan oleh panggilan ke metode tidak dapat dipertahankan di seluruh batas '
await' atau ''yield. - CS8204: Agar tipe digunakan sebagai AsyncMethodBuilder untuk tipe target, properti Task-nya harus mengembalikan tipe target alih-alih tipe yang dideklarasikan.
-
CS8403: Metode dengan blok iterator harus '
async' untuk mengembalikan IAsyncEnumerable<T>. - CS8411: Pernyataan foreach asinkron tidak dapat beroperasi pada variabel jenis karena jenis tidak berisi instans publik atau definisi ekstensi yang sesuai untuk anggota yang diperlukan.
- CS8892: Metode tidak akan digunakan sebagai titik masuk karena titik masuk sinkron ditemukan.
- CS8935: Atribut AsyncMethodBuilder tidak diizinkan pada metode anonim tanpa jenis pengembalian eksplisit.
- CS8940: Jenis pengembalian seperti tugas umum diharapkan, tetapi jenis yang ditemukan dalam atribut 'AsyncMethodBuilder' tidak cocok. Ini harus merupakan jenis aritas generik yang tidak terikat, dan jenis yang berisi (jika ada) harus non-generik.
-
CS9123: Operator '
&' tidak boleh digunakan pada parameter atau variabel lokal dalam metode asinkron. -
CS9330: '
MethodImplAttribute.Async' tidak dapat diterapkan secara manual ke metode. Tandai metode 'asinkron'.
Menunggu persyaratan ekspresi
- CS1985: Tidak dapat menggunakan 'await' dalam klausa catch.
-
CS1986: '
await' mengharuskan jenis memiliki metode 'GetAwaiter'yang cocok. -
CS1992: Operator '
await' hanya dapat digunakan saat terkandung dalam metode atau ekspresi lambda yang ditandai dengan pengubah ''async. -
CS1995: Operator '
await' hanya dapat digunakan dalam ekspresi kueri, yaitu dalam ekspresi koleksi pertama dari klausa 'from' awal atau dalam ekspresi koleksi dari klausa 'join'. - CS1996: Tidak dapat menunggu dalam isi pernyataan kunci.
-
CS4008: Tidak dapat menunggu '
void'. -
CS4032: Operator '
await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'async' dan mengubah jenis pengembaliannya menjadi 'Task<T>'. -
CS4033: Operator '
await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'async' dan mengubah jenis pengembaliannya menjadi 'Task'. -
CS4034: Operator '
await' hanya dapat digunakan dalam metode asinkron. Pertimbangkan untuk menandai metode ini dengan pengubah 'asinkron'. -
CS8178: Referensi yang dikembalikan oleh panggilan ini tidak dapat dipertahankan di seluruh batas '
await' atau ''yield. - CS8411: Pernyataan foreach asinkron tidak dapat beroperasi pada variabel jenis karena jenis tidak berisi instans publik atau definisi ekstensi yang sesuai untuk anggota yang diperlukan.
- CS4001: Tidak dapat menunggu ekspresi.
-
CS4003: '
await' tidak dapat digunakan sebagai pengidentifikasi dalam metode asinkron atau ekspresi lambda. -
CS4007: Instans tipe tidak dapat dipertahankan di seluruh batas '
await' atau 'yield'. -
CS4011: '
await' mengharuskan bahwa jenis pengembalian 'GetAwaiter()' dilengkapi dengan anggota 'IsCompleted', 'OnCompleted', dan 'GetResult', serta menerapkan 'INotifyCompletion' atau 'ICriticalNotifyCompletion'. - CS4027: Tipe tidak menerapkan anggota yang diperlukan.
-
CS4028: '
await' mengharuskan jenis memiliki metode 'GetAwaiter' yang sesuai. Apakah Anda kehilangan direktif penggunaan untuk 'Sistem'? -
CS8100: Operator '
await' tidak dapat digunakan dalam penginisialisasi variabel skrip statis.
Item berikut menjelaskan cara memperbaiki setiap kesalahan. Untuk informasi selengkapnya tentang await operator dan pola awaiter, lihat Pemrograman asinkron dengan async dan await.
- Tambahkan pengubah
asyncke metode atau ekspresi lambda yang berisiawaitekspresi (CS1992, CS4032, CS4033, CS4034). Pengompilasi memerlukan pengubahasyncsehingga dapat menghasilkan komputer status yang menangani suspensi asinkron dan dimulainya kembali. Tiga varian kesalahan ini memberikan saran khusus konteks untuk jenis pengembalian yang benar. - Pindahkan ekspresi
awaitkeluar dari blokcatchketika Anda menargetkan C# 5 atau sebelumnya (CS1985). Dimulai dengan C# 6, pengkompilasi mendukungawaitdi kedua blokcatchdanfinally. Kesalahan ini tidak lagi diproduksi di C# 6 dan yang lebih baru. - Memindahkan
ekspresi keluar dari blok pernyataan (CS1996 ). Penangguhan asinkron saat memegang kunci berisiko terjadi kebuntuan. Kunci tetap tertahan selama proses pergantian utas di mana kode lain mungkin sedang menunggu kunci yang sama. - Restrukturisasi ekspresi kueri sehingga
awaithanya muncul dalam ekspresi koleksi pertama dari klausafromawal atau dalam ekspresi koleksi dari klausajoin(CS1995). Klausa kueri lainnya diterjemahkan ke dalam ekspresi lambda yang tidak mendukung penangguhan asinkron. - Ubah jenis ekspresi yang ditunggu sehingga mengekspos metode yang dapat diakses
GetAwaiter()yang mengikuti pola awaiter (CS1986, CS4028). Jenisnya dapat mengimplementasikan pola secara langsung atau melalui metode ekstensi. Jika metode tersebut ada tetapi arahanGetAwaiteruntukusinghilang, pengkompilasi menghasilkan pesanSystemyang lebih spesifik alih-alih CS1986. - Pastikan jenis awaiter yang dikembalikan oleh
GetAwaiter()memilikiIsCompleted, ,OnCompleteddanGetResultanggota dan mengimplementasikan INotifyCompletion atau ICriticalNotifyCompletion (CS4011, CS4027). Ekspresiawaitini bergantung pada anggota-anggota tersebut untuk memeriksa status penyelesaian, mendaftarkan lanjutan, dan mengambil hasil. - Ubah jenis pengembalian metode yang disebut dari
voidke Task atau Task<TResult> sehingga hasilnya dapat ditunggu (CS4008). Anda tidak dapat menunggu metodevoidyang mengembalikan nilai karena tidak ada objek tugas untuk melacak penyelesaian atau menyebarkan pengecualian. - Ubah ekspresi yang ditunggu menjadi jenis yang mendukung pola penawa (CS4001). Jenis seperti
int,string, dan jenis bawaan lainnya tidak memiliki metodeGetAwaiterdan tidak dapat di-await secara langsung. - Simpan hasil panggilan metode pengembalian ref dalam variabel lokal sebelum menggunakan
await(CS8178). Referensi yang dikembalikan oleh metode tidak dapat dipertahankan di seluruh batasawaitkarena mesin status asinkron mungkin menangguhkan dan kemudian melanjutkan di utas atau konteks yang berbeda, sehingga membuat referensi menjadi tidak valid. - Terapkan IAsyncEnumerable<T> pada jenis koleksi, atau tambahkan metode yang dapat diakses
GetAsyncEnumeratoryang mengembalikan jenis denganCurrentanggota danMoveNextAsync(CS8411). Pernyataan iniawait foreachmemerlukan jenis koleksi untuk mengikuti pola asinkron yang dapat dijumlahkan. - Ganti nama variabel atau parameter lokal apa pun yang
awaitdinamaiasyncdi dalam metode atau ekspresi lambda (CS4003). Di dalam konteks asinkron,awaitadalah kata kunci kontekstual dan tidak dapat digunakan sebagai pengidentifikasi. - Pindahkan
awaitekspresi keluar dari penginisialisasi variabel skrip statis dan ke dalam isi metode (CS8100). Penginisialisasi statis berjalan di luar konteks asinkron, jadiawaittidak tersedia di lokasi tersebut. - Restrukturasi kode agar instance
ref structtidak perlu dipertahankan melewati batasawaitatauyield(CS4007). Mesin status asinkron menyimpan variabel lokal pada tumpukan, danref structjenis terikat tumpukan berdasarkan desain - mereka tidak dapat dipindahkan dengan aman ke penyimpanan timbunan di seluruh titik suspensi.
Persyaratan tanda tangan metode asinkron
-
CS1983: Karena ini adalah metode asinkron, ekspresi pengembalian harus berjenis 'T' daripada '
Task<T>'. -
CS1994: Pengubah '
async' hanya dapat digunakan dalam metode yang memiliki tubuh. - CS4009: Titik masuk yang void atau mengembalikan int tidak bisa asinkron.
- CS8892: Metode tidak akan digunakan sebagai titik masuk karena titik masuk sinkron ditemukan.
- CS8935: Atribut AsyncMethodBuilder tidak diizinkan pada metode anonim tanpa jenis pengembalian eksplisit.
- CS8940: Jenis pengembalian seperti tugas umum diharapkan, tetapi jenis yang ditemukan dalam atribut 'AsyncMethodBuilder' tidak cocok. Ini harus merupakan jenis aritas generik yang tidak terikat, dan jenis yang berisi (jika ada) harus non-generik.
-
CS8403: Metode dengan blok iterator harus '
async' untuk mengembalikan '{1}'. -
CS9330: '
MethodImplAttribute.Async' tidak dapat diterapkan secara manual ke metode. Tandai metode 'async'. - CS4005: Metode asinkron tidak dapat memiliki parameter jenis pointer.
- CS4006: __arglist tidak diizinkan dalam daftar parameter metode asinkron.
- CS4010: Tidak dapat mengonversi lambda asinkron ke tipe delegasi. Lambda asinkron dapat mengembalikan void, Task, atau Task<T>, yang tidak satu pun dapat dikonversi ke tipe pengembalian.
- CS4012: Parameter jenis tidak dapat dideklarasikan dalam metode asinkron atau ekspresi lambda asinkron.
- CS4015: 'MethodImplOptions.Synchronized' tidak dapat diterapkan ke metode asinkron.
- CS4016: Karena ini adalah metode asinkron, ekspresi pengembalian harus dari tipe tugas, bukan dari tipe umum.
- CS8031: Ekspresi lambda asinkron yang dikonversi ke delegat pengembalian tugas tidak dapat mengembalikan nilai.
- CS8204: Agar tipe dapat digunakan sebagai AsyncMethodBuilder untuk tipe, properti Task-nya harus mengembalikan tipe yang diperlukan, bukan tipe yang dideklarasikan.
Item berikut menjelaskan cara memperbaiki setiap kesalahan. Untuk informasi selengkapnya tentang deklarasi metode asinkron, lihat pengubah async dan jenis pengembalian Asinkron.
- Ubah ekspresi pengembalian agar sesuai dengan jenis hasil yang mendasar metode asinkron (CS1983, CS4016). Ketika metode asinkron mengembalikan
Task<T>, pernyataanreturnharus menyediakan nilai jenisT, bukanTask<T>, karena mesin status yang dihasilkan kompilator membungkus nilai dalam sebuah task secara otomatis. CS1983 muncul ketika metode kembaliTask<T>dan ekspresinya adalahT; CS4016 mencakup kasus umum di mana jenis ekspresi pengembalian tidak cocok. - Hapus pengubah
asyncdari metode yang tidak memiliki isi, seperti metode abstrak atau deklarasi metode antarmuka (CS1994). Pengubahasyncmemerlukan isi metode sehingga pengkompilasi dapat menghasilkan implementasi komputer status. - Ubah jenis pengembalian titik entri asinkron menjadi Task atau Task<TResult> (CS4009). Dimulai dengan C# 7.1,
Mainmetodenya bisaasync, tetapi harus mengembalikanTaskatauTask<int>-async voiddanasync intbukan tanda tangan titik masuk yang valid. - Hapus atau ganti nama satu titik entri saat proyek berisi metode sinkron dan asinkron
Main(CS8892). Pengompilasi memilih titik masuk sinkron dan mengeluarkan peringatan ini untuk kandidat asinkron yang diabaikannya. - Tambahkan jenis pengembalian eksplisit ke ekspresi lambda sebelum menerapkan
[AsyncMethodBuilder]atribut (CS8935). Pengompilasi tidak dapat menyelesaikan jenis penyusun untuk metode anonim yang jenis pengembaliannya disimpulkan, karena atribut harus dicocokkan dengan jenis pengembalian tertentu pada waktu kompilasi. - Ubah tipe yang ditentukan dalam atribut
[AsyncMethodBuilder]ke tipe generik tidak terikat dengan satu keseragaman, sepertiMyTaskMethodBuilder<>dibandingkan denganMyTaskMethodBuilder<T>atau tipe non-generik (CS8940). Jenis penyusun yang berisi, jika ada, juga harus non-generik. Pengkompilasi memerlukan bentuk ini sehingga dapat membangun pembangun untuk jenis pengembalian seperti tugas konkret. - Ganti atribut manual
[MethodImpl(MethodImplOptions.Async)]denganasynckata kunci pada deklarasi metode (CS9330). FlagMethodImplOptions.Asyncdicadangkan untuk penggunaan runtime internal dan tidak dapat diterapkan langsung dalam kode pengguna. - Tambahkan pengubah
asyncke metode yang berisi blok iterator dan kembalikan IAsyncEnumerable<T> atau IAsyncEnumerator<T> (CS8403). Tanpa pengubahasync, pengompilasi memperlakukan metode sebagai iterator sinkron dan tidak dapat menghasilkan mesin status aliran asinkron. - Hapus parameter jenis pointer dari metode asinkron (CS4005). Pointer mereferensikan lokasi memori tetap yang tidak dapat dipertahankan dengan aman di seluruh titik suspensi asinkron di mana eksekusi mungkin dilanjutkan pada utas yang berbeda.
- Hapus
__arglistdari daftar parameter metode asinkron (CS4006). Daftar argumen dengan panjang variabel bergantung pada konvensi panggilan berbasis tumpukan yang tidak kompatibel dengan mesin status asinkron yang dialokasikan di heap. - Hapus
refparameter ,in, atauout, dan parameter jenisref structseperti Span<T> atau ReadOnlySpan<T>, dari metode asinkron atau ekspresi lambda asinkron (CS4012). Jenis parameter ini terkait dengan stack dan tidak dapat ditangkap dengan aman dalam penutupan mesin status asinkron yang dialokasikan di heap. - Ubah jenis delegasi target agar sesuai dengan jenis pengembalian lambda asinkron (CS4010). Lambda asinkron dapat mengembalikan
void, , Taskatau Task<TResult>, dan pengompilasi tidak dapat mengonversinya ke jenis delegasi seganter yang mengharapkan jenis pengembalian yang berbeda. - Hapus ekspresi
returndari lambda asinkron yang ditetapkan ke delegasi pengembalianTasknon-generik, atau ubah jenis delegasi menjadiFunc<Task<T>>sehingga lambda dapat mengembalikan nilai (CS8031). Delegasi non-generikTask-returning mewakili operasi asinkron tanpa hasil, jadi mengembalikan nilai adalah ketidakcocokan tipe. -
[MethodImpl(MethodImplOptions.Synchronized)]Hapus atribut dari metode asinkron (CS4015). OpsiSynchronizedini memperoleh kunci untuk seluruh eksekusi metode, tetapi metode asinkron dapat menangguhkan dan melanjutkan di utas yang berbeda, membuat pemahaman kunci menjadi tidak terdefinisi. - Koreksi jenis kustom
AsyncMethodBuildersehingga propertinya mengembalikan jenis yang sama dengan jenis pengembalian yang dinyatakanTaskmetode asinkron (CS8204). Pengkompilasi menggunakan properti penyusunTaskuntuk mendapatkan objek tugas akhir, sehingga ketidakcocokan jenis mencegah komputer status berfungsi dengan benar.
Praktik asinkron
- CS1989: Ekspresi lambda asinkron tidak dapat dikonversi ke pohon ekspresi.
- CS1991: 'Type' tidak dapat menerapkan 'event' karena merupakan peristiwa Windows Runtime dan 'event' adalah peristiwa .NET biasa.
- CS1997: Karena fungsi adalah metode asinkron yang mengembalikan nilai, kata kunci pengembalian tidak boleh diikuti oleh ekspresi objek.
-
CS1998: Metode asinkron ini tidak memiliki operator '
await' dan akan berjalan secara sinkron. Pertimbangkan untuk menggunakan operator 'await' untuk menunggu panggilan API non-pemblokiran, atau 'await Task.Run(...)' untuk melakukan pekerjaan terikat CPU pada utas latar belakang. -
CS4014: Karena panggilan ini tidak ditunggu, eksekusi metode saat ini berlanjut sebelum panggilan selesai. Pertimbangkan untuk menerapkan
awaitoperator ke hasil panggilan. - CS8177: Metode asinkron tidak dapat memiliki variabel lokal dengan referensi.
-
CS9123: Operator '
&' tidak boleh digunakan pada parameter atau variabel lokal dalam metode asinkron. - CS4029: Tidak dapat mengembalikan ekspresi jenis 'void'.
- CS4030: Atribut keamanan tidak dapat diterapkan ke metode Asinkron.
- CS4031: Metode asinkron tidak diizinkan dalam Antarmuka, Kelas, atau Struktur yang memiliki atribut 'SecurityCritical' atau 'SecuritySafeCritical'.
Item berikut menjelaskan cara memperbaiki setiap kesalahan. Untuk informasi selengkapnya, lihat Pemrograman asinkron dengan async dan await dan await operator.
-
awaitTambahkan operator ke setiap panggilan yang mengembalikan Task atau Task<TResult>, atau secara eksplisit membuang hasilnya dengan_ =jika perilaku fire-and-forget benar-benar dimaksudkan (CS4014). Tanpaawait, pengecualian apa pun yang dilemparkan oleh operasi asinkron hilang secara diam-diam, dan metode panggilan terus dijalankan sebelum operasi selesai, yang dapat menyebabkan bug urutan dan kebenaran yang halus. -
returnHapus ekspresi dari metode asinkron yang jenis pengembaliannya adalahTask(non-generik), atau ubah jenis pengembalian menjadiTask<T>ketika metode perlu mengembalikan nilai (CS1997). Dalam metode asinkron yang mengembalikanTask, pengkompilasi menghasilkan pembungkus tugas - mengembalikan nilai adalah jenis ketidakcocokan karena tanda tangan metode tidak menjanjikan hasil. - Tambahkan setidaknya satu
awaitekspresi ke isi metode, atau hapusasyncpengubah dan kembalikan tugas secara langsung (CS1998). Metodeasyncyang tanpa ekspresi apapun berjalan sepenuhnya secara sinkron, yang menambahkan overhead mesin status yang tidak perlu. Jika metode secara sengaja membungkus operasi sinkron, menghapusasyncdan mengembalikan tugas tersebut secara eksplisit menghilangkan overhead tersebut. - Tulis ulang ekspresi lambda sehingga tidak digunakan
asyncsaat ditetapkan ke jenis pohon ekspresi sepertiExpression<Func<...>>(CS1989). Pohon ekspresi mewakili kode sebagai struktur data yang dapat dianalisis atau diterjemahkan oleh pengkompilasi, tetapi komputer status kompleks yangasyncmenghasilkan tidak dapat ditangkap di pohon ekspresi. - Ubah implementasi peristiwa sehingga deklarasi antarmuka dan kelas pelaksana menyetujui apakah peristiwa menggunakan semantik Windows Runtime atau semantik .NET reguler (CS1991). Kesalahan ini berlaku untuk skenario interop Windows Runtime di mana peristiwa WinRT tidak dapat diimplementasikan sebagai peristiwa .NET biasa atau sebaliknya.
- Hapus operator pengambil alamat (
&) dari ekspresi yang merujuk parameter atau variabel lokal di dalam metode asinkron (CS9123). Mesin status asinkron dapat merelokasi variabel yang ditangkap ke tumpukan selama penangguhan, yang akan membatalkan validitas setiap penunjuk yang diperoleh melalui alamat dari. - Hapus variabel lokal berdasarkan referensi dari metode asinkron, atau pastikan variabel tersebut tidak menjangkau
awaitbatas (CS8177). Mesin status asinkron menangkap variabel lokal dalam closure yang dialokasikan di heap, dan referensi ke lokasi stack tidak dapat dipertahankan dengan aman melewati titik-titik penangguhan. Di C# 13 dan yang lebih baru,refvariabel lokal diizinkan dalam metode asinkron selama mereka tidak menjangkau batasawait, dan kesalahan ini tidak akan muncul. -
returnHapus pernyataan yang mengembalikan hasil metodevoid-returning, atau ubah metode yang dipanggil untuk mengembalikan nilai (CS4029). Anda tidak dapat menggunakanreturn SomeVoidMethod();karenavoidbukan jenis yang dapat dikembalikan sebagai nilai. Entah hapus kata kuncireturndan panggil metode sebagai pernyataan terpisah, atau ubah deklarasi metode yang dipanggil untuk mengembalikan tipe konkret. - Hapus atribut keamanan seperti
[SecurityCritical]atau[SecuritySafeCritical]dari metode asinkron (CS4030), atau hapusasyncpengubah dari metode dalam jenis yang ditandai dengan atribut ini (CS4031). Anotasi keamanan akses kode berlaku untuk metode deklarasikan, tetapi mesin status asinkron yang dihasilkan kompilator berjalan dalam konteks terpisah di mana anotasi keamanan tersebut tidak dapat diberlakukan.