Bagikan melalui


Mengatasi kesalahan dan peringatan yang terkait dengan titik masuk program

Artikel ini membahas kesalahan dan peringatan pengkompilasi berikut:

  • CS0017: Program 'nama file output' memiliki lebih dari satu titik masuk yang ditentukan. Kompilasi dengan /main untuk menentukan jenis yang berisi titik masuk.
  • CS0028: 'deklarasi fungsi' memiliki tanda tangan yang salah untuk menjadi titik masuk
  • CS0402: 'identifier': titik masuk tidak boleh generik atau dalam tipe generik
  • CS1555: Tidak dapat menemukan 'kelas' yang ditentukan untuk metode Utama
  • CS1556: 'konstruksi' yang ditentukan untuk Metode utama harus merupakan kelas atau struktur yang valid
  • CS1557: Tidak dapat menggunakan 'kelas' untuk metode Utama karena berada dalam file output yang berbeda
  • CS1558: 'class' tidak memiliki metode Utama statis yang sesuai
  • CS1559: Tidak dapat menggunakan 'objek' untuk metode Utama karena diimpor
  • CS2017: Tidak dapat menentukan /main jika membuat modul atau pustaka
  • CS5001: Program tidak berisi metode 'Main' statis yang cocok untuk titik masuk
  • CS7022: Titik masuk program adalah kode global; mengabaikan titik masuk '{0}'.
  • CS8801: Tidak dapat menggunakan variabel lokal atau fungsi lokal '{0}' yang dideklarasikan dalam pernyataan tingkat atas dalam konteks ini.
  • CS8802: Hanya satu unit kompilasi yang dapat memiliki pernyataan tingkat atas.
  • CS8803: Pernyataan tingkat atas harus mendahului namespace dan deklarasi jenis.
  • CS8805: Program yang menggunakan pernyataan tingkat atas harus dapat dieksekusi.
  • CS8899: Titik masuk aplikasi tidak dapat dikaitkan dengan 'UnmanagedCallersOnly'.
  • CS8937: Setidaknya satu pernyataan tingkat atas harus tidak kosong.

Main deklarasi metode

  • CS0017: Program 'nama file output' memiliki lebih dari satu titik masuk yang ditentukan. Kompilasi dengan /main untuk menentukan jenis yang berisi titik masuk.
  • CS0028: 'deklarasi fungsi' memiliki tanda tangan yang salah untuk menjadi titik masuk
  • CS0402: 'pengidentifikasi': titik entri tidak dapat bersifat generik atau berada dalam tipe generik
  • CS1558: 'class' tidak memiliki metode Utama statis yang sesuai
  • CS5001: Program tidak berisi metode 'Main' statis yang cocok untuk titik masuk
  • CS8899: Titik masuk aplikasi tidak dapat dikaitkan dengan 'UnmanagedCallersOnly'.

Program yang dikompilasi ke executable harus berisi metode yang valid Main sebagai titik masuknya. Untuk informasi selengkapnya, lihat Argumen main() dan baris perintah.

Untuk memperbaiki kesalahan ini, pastikan deklarasi metode Anda Main mengikuti aturan berikut:

  • Nyatakan metode Main sebagai static dengan jenis pengembalian void, int, Task, atau Task<int>, karena runtime memerlukan signatur tertentu untuk mengidentifikasi titik masuk program (CS0028, CS1558). Metode ini dapat secara opsional menerima string[] parameter untuk argumen baris perintah. Jika Anda menggunakan pengubah async , jenis pengembalian harus Task atau Task<int>, dan Anda harus menargetkan bahasa C# versi 7.1 atau yang lebih tinggi.
  • Pindahkan Main metode dari tipe generik mana pun, karena runtime tidak dapat menyelesaikan titik masuk yang unik ketika tipe yang menaunginya memerlukan argumen tipe (CS0402).
  • UnmanagedCallersOnlyAttribute Hapus atribut dari Main metode , karena titik masuk harus dapat dipanggil dari kode terkelola dan UnmanagedCallersOnly membatasi metode hanya untuk penelepon yang tidak dikelola (CS8899).
  • Saat kode Anda berisi beberapa Main metode di berbagai jenis, gunakan opsi kompilator StartupObject untuk menentukan jenis mana yang berisi titik masuk yang dimaksudkan (CS0017). Tanpa opsi itu, pengkompilasi tidak dapat menentukan metode mana yang Main akan digunakan.
  • Verifikasi bahwa proyek executable harus mendefinisikan metode Main dengan tanda tangan yang tepat, karena proyek dengan OutputTypeexe atau winexe memerlukan titik masuk (CS5001, CS1558). Nama metode bersifat sensitif terhadap huruf besar/kecil - main tidak memenuhi syarat. Jika Anda tidak memerlukan executable, ubah jenis output ke pustaka.

Nota

CS0028 adalah diagnostik warisan yang tidak dihasilkan pengkompilasi C# saat ini. Versi modern dari kompilator melaporkan CS1558 atau CS5001 sebagai gantinya Main jika metode memiliki tanda tangan yang tidak valid.

Nota

CS0017, CS0028, CS0402, CS1558, dan CS5001 hanya dilaporkan selama operasi Build atau Pembangunan ulang . Mereka tidak muncul sebagai diagnostik IntelliSense saat Anda mengetik di IDE.

StartupObject opsi pengkompilasi

  • CS1555: Tidak dapat menemukan 'kelas' yang ditentukan untuk metode Utama
  • CS1556: 'konstruksi' yang ditentukan untuk Metode utama harus merupakan kelas atau struktur yang valid
  • CS1557: Tidak dapat menggunakan 'kelas' untuk metode Utama karena berada dalam file output yang berbeda
  • CS1559: Tidak dapat menggunakan 'objek' untuk metode Utama karena diimpor
  • CS2017: Tidak dapat menentukan /main jika membuat modul atau pustaka

Opsi pengkompilasi StartupObject (juga dikenal sebagai /main) menentukan tipe mana yang berisi metode Main milik program ketika beberapa tipe mendefinisikan satu. Untuk informasi selengkapnya, lihat Argumen StartupObject dan Main() dan baris perintah.

Untuk memperbaiki kesalahan ini, pastikan opsi StartupObject merujuk ke jenis yang valid.

  • Verifikasi bahwa nama kelas yang sepenuhnya memenuhi syarat yang Anda berikan cocok dengan StartupObject jenis yang ditentukan dalam kode sumber kompilasi saat ini. Pengkompilasi hanya mencari file sumber yang dikompilasi - bukan rakitan yang dirujuk - untuk jenis yang ditentukan (CS1555). Periksa kesalahan ketik dalam nama lengkap, termasuk namespace.
  • Pastikan pengidentifikasi yang Anda berikan untuk StartupObject merujuk pada class atau struct yang bukan bersifat generik. Pengompilasi memerlukan tipe konkret yang dapat berisi metode Main yang valid (CS1556). Antarmuka, enum, delegasi, dan jenis generik bukan target yang valid.
  • Pindahkan kelas yang ditentukan ke dalam file output yang sama dengan kompilasi saat ini. Opsi /main menentukan titik masuk dalam satu rakitan output dan tidak dapat mereferensikan tipe yang dikompilasi ke dalam output yang berbeda (CS1557).
  • Pastikan jenis yang ditentukan ada dalam kode sumber proyek saat ini, bukan dalam assembly yang direferensikan. Pengkompilasi tidak dapat menunjuk jenis yang diimpor sebagai titik masuk (CS1559).
  • /main Hapus opsi saat membuat pustaka atau modul. Hanya proyek yang dapat dieksekusi (dengan OutputTypeexe atau winexe) yang memiliki titik masuk (CS2017). Jika Anda memerlukan titik masuk, ubah jenis output menjadi dapat dieksekusi.
  • Pastikan jenis yang ditentukan dengan StartupObject mendeklarasikan metode yang valid Main. Jika jenis ada tetapi tidak berisi metode statis Main yang sesuai, pengkompilasi menghasilkan CS1558. Lihat bagian Main deklarasi metode untuk tanda tangan yang diperlukan.

Nota

CS1557 dan CS1559 adalah diagnostik warisan yang tidak dihasilkan kompilator C# saat ini. Skenario yang memicu kesalahan ini tidak lagi didukung atau jarang terjadi untuk menjamin deteksi.

Nota

CS1555 dan CS1556 hanya dilaporkan selama operasi Build atau Pembangunan ulang . Mereka tidak muncul sebagai diagnostik IntelliSense saat Anda mengetik di IDE.

Pernyataan tingkat tinggi

  • CS7022: Titik masuk program adalah kode global; mengabaikan titik masuk '{0}'.
  • CS8801: Tidak dapat menggunakan variabel lokal atau fungsi lokal '{0}' yang dideklarasikan dalam pernyataan tingkat atas dalam konteks ini.
  • CS8802: Hanya satu unit kompilasi yang dapat memiliki pernyataan tingkat atas.
  • CS8803: Pernyataan tingkat atas harus mendahului namespace dan deklarasi jenis.
  • CS8805: Program yang menggunakan pernyataan tingkat atas harus dapat dieksekusi.
  • CS8937: Setidaknya satu pernyataan tingkat atas harus tidak kosong.

Pernyataan tingkat atas menggantikan metode eksplisit Main sebagai titik masuk program. Untuk informasi selengkapnya, lihat Pernyataan tingkat atas dalam panduan pemrograman C# dan spesifikasi fitur pernyataan tingkat atas .

Untuk memperbaiki kesalahan ini, pastikan penggunaan pernyataan tingkat atas Anda mengikuti aturan berikut:

  • Konsolidasikan semua pernyataan tingkat atas ke dalam satu file, karena hanya satu unit kompilasi (file) yang dapat berisi pernyataan tingkat atas (CS8802). Pindahkan kode tingkat atas dari file lain ke dalam satu file tersebut. Restrukturisasi file yang tersisa sehingga hanya berisi namespace dan deklarasi tipe.
  • Tempatkan semua pernyataan tingkat atas sebelum salah satu namespace atau type deklarasi dalam file, karena pengkompilasi memerlukan pernyataan tingkat atas untuk muncul terlebih dahulu (CS8803). Jika Anda memiliki using arahan, arahan tersebut masih dapat mendahului pernyataan tingkat atas.
  • Sertakan setidaknya satu pernyataan yang berisi kode yang dapat dieksekusi, karena file dengan hanya pernyataan kosong, spasi kosong, atau komentar tidak memenuhi syarat sebagai titik masuk yang valid (CS8937). Tambahkan pernyataan seperti panggilan metode, penetapan variabel, atau ekspresi untuk memenuhi persyaratan.
  • Akses variabel lokal dan fungsi lokal yang dideklarasikan dalam pernyataan tingkat atas hanya dari dalam konteks pernyataan tingkat atas itu sendiri, karena deklarasi tersebut dicakup ke metode titik masuk yang dihasilkan dan tidak terlihat oleh file lain atau untuk mengetik anggota yang dideklarasikan dalam file yang sama (CS8801). Jika Anda perlu berbagi status di seluruh file, deklarasikan variabel sebagai bidang statis atau properti pada jenis sebagai gantinya.
  • Atur OutputType proyek ke exe, karena pernyataan tingkat atas menentukan titik masuk dan titik masuk hanya valid dalam proyek yang dapat dieksekusi (CS8805). Jika Anda membangun pustaka, hapus pernyataan tingkat atas dan gunakan jenis dan metode sebagai gantinya.
  • Hapus atau ganti nama metode eksplisit Main apa pun ketika pernyataan tingkat atas ada, karena pengkompilasi memperlakukan pernyataan tingkat atas sebagai titik masuk dan mengabaikan metode apa pun Main , menghasilkan peringatan (CS7022). Jika Anda ingin menggunakan metode eksplisit Main , pindahkan kode pernyataan tingkat atas ke metode tersebut dan hapus pernyataan tingkat atas.