Kesalahan dan peringatan pra-prosesor

Pengkompilasi menghasilkan kesalahan berikut untuk penggunaan direktif praprosesor yang salah:

  • CS1024: Pengarahan pra-pemroses diharapkan
  • CS1025: Komentar baris tunggal atau akhir baris yang diharapkan
  • CS1027: direktif #endif diperlukan
  • CS1028: Direktif praprosesor tak terduga
  • CS1029: #error: 'text'
  • CS1030: #warning: 'text'
  • CS1032: Tidak dapat menentukan/membatalkan definisi simbol prapemrosedur setelah token pertama dalam file
  • CS1038: diharapkan adanya direktif #endregion
  • CS1040: Arahan pra-prosesor harus muncul sebagai karakter non-spasi-putih pertama pada baris
  • CS1517: Ekspresi pra-prosesor tidak valid
  • CS1560: Nama file tidak valid yang ditentukan untuk arahan preprocessor. Nama file terlalu panjang atau bukan nama file yang valid
  • CS1576: Nomor baris yang ditentukan untuk direktif #line hilang atau tidak valid
  • CS1578: Nama file, komentar baris tunggal, atau akhir baris yang diharapkan
  • CS1633: Direktif #pragma tidak dikenal
  • CS1634: Penonaktifan atau pemulihan yang diharapkan
  • CS1635: Tidak dapat memulihkan peringatan 'kode peringatan' karena dinonaktifkan secara global
  • CS1691: 'number' bukan kode peringatan yang valid
  • CS1692: Nomor tidak valid
  • CS1694: Nama file tidak valid yang ditentukan untuk arahan preprocessor. Nama file terlalu panjang atau bukan nama file yang valid
  • CS1695: Sintaks checksum #pragma tidak valid; harus #pragma checksum "filename" "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX}" "XXXX..."
  • CS1696: Komentar baris tunggal atau akhir baris yang diharapkan
  • CS1709: Nama file yang ditentukan untuk arahan preprocessor kosong
  • CS7009: Tidak dapat menggunakan #r setelah token pertama dalam file
  • CS7010: Nama file yang dikutip diharapkan
  • CS7011: #r hanya diizinkan dalam skrip
  • CS8097: #load hanya diizinkan dalam skrip
  • CS8098: Tidak dapat menggunakan #load setelah token pertama dalam file
  • CS8301: Nama tidak valid untuk simbol pra-pemrosesan; 'nama simbol' bukan pengidentifikasi yang valid
  • CS8938: Nilai direktif #line tidak ada atau di luar rentang
  • CS8939: Posisi akhir arahan #line harus lebih besar dari atau sama dengan posisi awal
  • CS8996: Literal string mentah tidak diizinkan dalam direktif prapemrosan
  • CS9028: Direktif #line span memerlukan spasi sebelum tanda kurung pertama, sebelum offset karakter, dan sebelum nama file
  • CS9297: #: direktif tidak boleh berada setelah token pertama dalam file
  • CS9298: #: arahan hanya dapat digunakan dalam aplikasi berbasis file (-features:FileBasedProgram)
  • CS9299: arahan #: tidak boleh setelah arahan #if
  • CS9314: #! arahan hanya dapat digunakan dalam skrip atau aplikasi berbasis file
  • CS9378: '#!' harus menjadi karakter pertama pada baris pertama file

Sintaks direktif praprosesor tidak valid

  • CS1024: Direktif pra-prosesor diharapkan
  • CS1025: Komentar baris tunggal atau akhir baris yang diharapkan
  • CS1027: direktif #endif sedang diharapkan
  • CS1028: Direktif praprosesor tak terduga
  • CS1032: Tidak dapat menentukan/membatalkan definisi simbol prapemrosedur setelah token pertama dalam file
  • CS1038: direktif #endregion diharapkan
  • CS1040: Arahan pra-prosesor harus muncul sebagai karakter non-spasi-putih pertama pada baris
  • CS1517: Ekspresi pra-prosesor tidak valid
  • CS1633: Direktif #pragma tidak teridentifikasi
  • CS1696: Komentar baris tunggal atau akhir baris yang diharapkan
  • CS8996: Literal string mentah tidak diizinkan dalam direktif prapemrosan

Kesalahan ini menunjukkan bahwa Anda menggunakan sintaksis yang tidak valid untuk direktif praproscessor. Penyebab umumnya meliputi:

  • Menggunakan arahan yang tidak dikenal setelah # (CS1024, CS1633).
  • Termasuk komentar multibaris pada garis direktif (CS1025, CS1696).
  • Menggunakan arahan di lokasi yang tidak terduga (CS1028).
  • Tidak ada arahan pencocokan yang diperlukan (CS1027, CS1038).
  • Menempatkan #define atau #undef direktif setelah token pertama dalam file (CS1032).
  • Tidak menempatkan direktif sebagai token pertama pada baris (CS1040).
  • Menggunakan ekspresi yang tidak valid dalam kompilasi kondisional (CS1517).
  • Menggunakan literal string mentah pada direktif pra-pemroses (CS8996).

Contoh CS1024 - Direktif praprosesor diharapkan:

#import System   // CS1024 - "import" is not a valid directive

Contoh CS1025 - Komentar baris tunggal atau akhir baris yang diharapkan:

#if true /* hello  
*/   // CS1025 - multiline comment not allowed
#endif

Contoh CS1027 - direktif #endif diharapkan:

#if true   // CS1027 - missing #endif
class Test { }

Contoh CS1028 - Direktif praprosesor tidak terduga:

#endif   // CS1028 - no matching #if

Contoh CS1032 - #define dan #undef direktif pra-prosesor harus muncul sebelum token lain:

class Test { }
#define X   // CS1032 - directive appears after the first token

Untuk memperbaiki error ini, tempatkan semua direktif #define dan #undef sebelum token pertama dalam berkas:

#define X
#undef Y
class Test { }

Contoh CS1038 - diharapkan adanya direktif #endregion:

#region testing
class Test { }
// CS1038 - missing #endregion

Contoh CS1040 - Direktif pra-prosesor harus muncul sebagai karakter non-spasi putih pertama:

/* Comment */ #define X   // CS1040 - directive not first on line

Contoh CS1517 - Ekspresi praprosesor tidak valid:

#if 1           // CS1517 - numeric literals not allowed
#endif
#if ~symbol     // CS1517 - bitwise operators not allowed  
#endif

Contoh CS1633 - Direktif #pragma tidak dikenali:

#pragma unknown  // CS1633 - "unknown" is not a valid pragma

Contoh CS8996 - Literal string mentah tidak diizinkan dalam direktif prapemrosan:

// CS8996.cs
#pragma checksum """raw_string""" "{406EA660-64CF-4C82-B6F0-42D48172A799}" "hash"  // CS8996
class Test { }

Untuk memperbaiki kesalahan ini, gunakan string reguler literal:

#pragma checksum "filename.cs" "{406EA660-64CF-4C82-B6F0-42D48172A799}" "hash"  // OK
class Test { }

Untuk memperbaiki kesalahan ini, pastikan direktif pra-prosesor Anda mengikuti aturan sintaks yang benar yang dijelaskan dalam dokumentasi direktif praproscessor.

Nama simbol pra-prosesor tidak valid

  • CS8301: Nama tidak valid untuk simbol pra-pemrosesan; 'nama simbol' bukan pengidentifikasi yang valid

Saat Anda membuat CSharpParseOptions secara terprogram, berikan setiap simbol kompilasi bersyarkat sebagai satu nama berbentuk pengidentifikasi. Karakter pertama harus valid di awal pengidentifikasi C#, dan karakter yang tersisa harus berupa karakter pengidentifikasi yang valid. Roslyn juga menerima teks kata kunci sebagai nama simbol, tetapi jangan tambahkan awalan @ . Jangan sertakan spasi kosong, tanda baca seperti . atau -, penugasan seperti FEATURE=1, atau ekspresi kondisi lengkap.

Simbol pra-pemrosesan hanya mencatat apakah namanya ditentukan. Ini tidak menyimpan nilai. Nama tidak valid yang disediakan melalui properti proyek DefineConstants atau -define opsi kompilator menghasilkan CS2029 sebagai gantinya; lihat DefineConstants.

Kesalahan pada arahan #error dan #warning

  • CS1029: #error: 'text'
  • CS1030: #warning: 'text'
  • CS1634: Penonaktifan atau pemulihan yang diharapkan
  • CS1635: Tidak dapat memulihkan peringatan 'kode peringatan' karena dinonaktifkan secara global
  • CS1691: 'number' bukan nomor peringatan yang valid
  • CS1692: Nomor tidak valid

Kesalahan ini terjadi ketika kompilator memproses #error, , #warningdan #pragma warning direktif. Arahan ini memungkinkan Anda menghasilkan pesan kesalahan dan peringatan kustom selama kompilasi dan perilaku peringatan kontrol.

CS1029 menampilkan teks kesalahan yang ditentukan dengan direktif #error :

// CS1029.cs
class Sample
{
   static void Main()
   {
      #error Let's give an error here   // CS1029
   }
}

Kompilasi menghasilkan output berikut:

example.cs(9,8): error CS1029: #error: 'Let's give an error here   // CS1029  '

CS1030 menampilkan teks peringatan yang ditentukan dengan arahan #warning :

// CS1030.cs
class Sample
{
   static void Main()
   {
      #warning Let's give a warning here
   }
}

Kompilasi menghasilkan output berikut:

example.cs(6,16): warning CS1030: #warning: 'Let's give a warning here'

CS1634 terjadi ketika #pragma warning klausul terbentuk dengan buruk, seperti ketika nonaktifkan atau pemulihan dihilangkan:

// CS1634.cs
// compile with: /W:1

#pragma warning   // CS1634
// Try this instead:
// #pragma warning disable 0219

class MyClass
{
  public static void Main()
  {
  }
}

CS1635 terjadi ketika Anda menggunakan opsi baris perintah atau pengaturan proyek untuk menonaktifkan peringatan secara global, tetapi gunakan /nowarn untuk mencoba memulihkan peringatan tersebut#pragma warning restore:

// CS1635.cs
// compile with: /w:1 /nowarn:162

enum MyEnum {one=1,two=2,three=3};

class MyClass
{
    public static void Main()
    {
#pragma warning disable 162

    if (MyEnum.three == MyEnum.two)
        System.Console.WriteLine("Duplicate");

#pragma warning restore 162  // CS1635
    }
}

CS1691 terjadi ketika angka yang diteruskan ke #pragma warning direktif bukan nomor peringatan yang valid:

// CS1691.cs
public class C
{
    int i = 1;
    public static void Main()
    {
        C myC = new C();
#pragma warning disable 151  // CS1691
// Try the following line instead:
// #pragma warning disable 1645
        myC.i++;
#pragma warning restore 151  // CS1691
// Try the following line instead:
// #pragma warning restore 1645
    }
}

CS1692 terjadi ketika angka dalam arahan prapemroscessor seperti #pragma dan #line tidak valid karena terlalu besar, dalam format yang salah, atau berisi karakter ilegal:

// CS1692.cs

#pragma warning disable a  // CS1692
// Try this instead:
// #pragma warning disable 1691

class A
{
    static void Main()
    {
    }
}

Arahan ini berguna untuk skenario kompilasi kondisional di mana Anda ingin memberi tahu pengembang tentang kondisi tertentu dalam kode, atau mengontrol peringatan mana yang ditampilkan selama kompilasi. Untuk informasi selengkapnya tentang menggunakan arahan ini, lihat dokumentasi arahan prapemrosan dan peringatan #pragma.

#line dan kesalahan direktif file

  • CS1560: Nama file tidak valid yang ditentukan untuk arahan preprocessor. Nama file terlalu panjang atau bukan nama file yang valid.
  • CS1576: Nomor baris yang ditentukan untuk direktif #line hilang atau tidak valid.
  • CS1578: Nama file, komentar baris tunggal, atau akhir baris yang diharapkan.
  • CS1694: Nama file tidak valid yang ditentukan untuk arahan preprocessor. Nama file terlalu panjang atau bukan nama file yang valid.
  • CS1695: Sintaks checksum #pragma tidak valid; harus #pragma checksum "filename" "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX}" "XXXX...".
  • CS1709: Nama file yang ditentukan untuk arahan preprocessor kosong.
  • CS8938: Nilai direktif #line hilang atau di luar rentang.
  • CS8939: Posisi akhir arahan #line harus lebih besar dari atau sama dengan posisi awal.
  • CS9028: Direktif span #line memerlukan spasi sebelum kurung buka pertama, sebelum offset karakter, dan sebelum nama file.

Kesalahan ini menunjukkan penggunaan #line direktif yang salah atau arahan prapemrosan terkait file. Penyebab umumnya meliputi:

  • Nama file tidak valid atau hilang (CS1560, CS1694, CS1709).
  • Format atau nilai nomor baris yang salah (CS1576, CS8938, CS8939).
  • Tidak ada sintaks yang tepat untuk nama file dan komentar (CS1578).
  • Sintaksis cacat #pragma checksum (CS1695).
  • Spasi yang tidak tepat dalam direktif rentang #line (CS9028).

Contoh CS1560/CS1694 - Nama file yang ditentukan tidak valid:

#line 100 "MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890.txt"   // CS1560/CS1694 - filename too long

Contoh CS1576 - Nomor baris hilang atau tidak valid:

#line "abc.sc"         // CS1576 - missing line number
#line abc "file.cs"    // CS1576 - invalid line number format

Contoh CS1578 - Nama file, komentar, atau akhir baris yang diharapkan:

#line 101 abc.cs   // CS1578 - filename not quoted

Contoh CS1695 - Sintaks checksum #pragma tidak valid:

#pragma checksum "12345"  // CS1695 - missing GUID and checksum

Contoh CS1709 - Nama file kosong:

#pragma checksum "" "{406EA660-64CF-4C82-B6F0-42D48172A799}" ""  // CS1709 - empty filename

Contoh CS8938 - nilai direktif #line hilang atau di luar rentang:

#line   // CS8938 - missing value
#line 0  // CS8938 - out of range (must be 1-16,707,566)

Contoh CS8939 - kesalahan posisi akhir baris #line:

#line (1, 10) - (1, 5) "file.cs"  // CS8939 - end column < start column

Contoh CS9028 - #line jangkauan pengaturan jarak direktif:

#line(1, 1) - (1, 10)"file.cs"  // CS9028 - missing spaces

Untuk memperbaiki kesalahan ini, pastikan #line arahan anda dan direktif prapemrosan terkait file mengikuti sintaks yang benar seperti yang dijelaskan dalam dokumentasi direktif pra-prosesor.

Penggunaan direktif aplikasi berbasis file yang salah

  • CS9297: #: arahan tidak boleh muncul setelah token pertama di dalam berkas
  • CS9298: #: arahan hanya dapat digunakan dalam aplikasi berbasis file (-features:FileBasedProgram)
  • CS9299: #: arahan tidak boleh setelah #if direktif
  • CS9314: #! arahan hanya dapat digunakan dalam skrip atau aplikasi berbasis file
  • CS9378: '#!' harus menjadi karakter pertama pada baris pertama file

Kesalahan ini menunjukkan bahwa Anda menggunakan direktif #: atau #! secara tidak tepat. Untuk mempelajari selengkapnya tentang sintaks untuk arahan ini, lihat artikel tentang direktif prapemrosan di bagian tentang aplikasi berbasis file. Atau, Anda dapat menjelajahi aplikasi berbasis file dengan mengikuti tutorial tentang aplikasi berbasis file.

Shebang (#!) memilih yang dapat dieksekusi untuk skrip atau aplikasi berbasis file. Letakkan pada karakter pertama baris pertama, sebelum spasi kosong, komentar, atau baris kosong (CS9378); lihat panduan direktif aplikasi berbasis file.

File berisi arahan script.cs

Kesalahan berikut menunjukkan penggunaan atau penempatan direktif skrip C# yang salah:

  • CS7009: Tidak dapat menggunakan #r setelah token pertama dalam file
  • CS7010: Nama file dalam tanda kutip diharapkan
  • CS7011: #r hanya diizinkan dalam skrip
  • CS8097: #load hanya diizinkan dalam skrip
  • CS8098: Tidak dapat menggunakan #load setelah token pertama dalam file

Dalam skrip C# (.csx), direktif #load setelah sebuah token menghasilkan CS8098:

System.Console.WriteLine("This is the first token.");
#load "helpers.csx" // CS8098

Untuk memperbaiki CS8098, pindahkan setiap direktif #load sebelum setiap token dalam skrip:

#load "helpers.csx"
System.Console.WriteLine("The directive precedes the first token.");

Dalam file sumber C# reguler (.cs), #load tidak diizinkan. Kondisi terkait itu menghasilkan CS8097, bukan CS8098. Hapus #load dari file sumber reguler.