共用方式為


前置處理器錯誤和警告

編譯器會產生下列錯誤,係由於不正確使用前置處理器指令:

  • CS1024預期預處理器指令
  • CS1025預期單行註解或行結尾
  • CS1027預期 #endif 指令
  • CS1028非預期的前置處理器指示詞
  • CS1029#error:「文字」
  • CS1030#warning:「文字」
  • CS1032無法在檔案的第一個標記之後定義/取消定義前置處理器符號
  • CS1038預期 #endregion 指令
  • CS1040前置處理器指示詞必須顯示為行上的第一個非空格字元
  • CS1517無效的前置處理器運算式
  • CS1560為前置處理器指示詞指定的檔名無效。檔案名稱太長或不是有效的檔案名稱
  • CS1576在 #line 指令中指定的行號遺失或無效
  • CS1578預期檔案名稱、單行註解或行尾
  • CS1633無法辨識的 #pragma 指示詞
  • CS1634預期停用或還原
  • CS1635無法還原警告「警告代碼」,因為它已全域停用
  • CS1691:「數字」不是有效的警告號碼
  • CS1692號碼無效
  • CS1694針對前置處理器指示詞指定的檔名無效。檔案名稱太長或不是有效的檔案名稱
  • CS1695#pragma 校驗碼語法無效,應該為 #pragma 校驗碼 “filename” “{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}” “XXXX...”
  • CS1696預期單行註解或行尾
  • CS1709為前置處理器指示詞指定的檔名是空的
  • CS7009檔案中的第一個標記之後不能使用 #r
  • CS7010預期會以引號括住的檔案名稱
  • CS7011只有腳本中才允許 #r
  • CS8097只有腳本中才允許 #load
  • CS8098無法在檔案中第一個標記之後使用 #load
  • CS8938#line 指令值遺失或超出範圍
  • CS8939#line 指示詞結束位置必須大於或等於起始位置
  • CS8996預處理器指令中不允許使用原始字串字面值
  • CS9028#line span 指示詞需要在第一個括弧、字元位移和檔名之前加上空格
  • CS9297#: 指令不能位於檔案中的第一個語彙單元後面
  • CS9298#: 指令只能用於以檔案為基礎的程式(-features:FileBasedProgram
  • CS9299#:指令不能在#if指令之後
  • CS9314#! 指令只能用於腳本或檔案型程式

前置處理器指引語法無效

  • CS1024預期前置處理器指令
  • CS1025預期單行註解或注释結束符
  • CS1027:預期指令為 #endif
  • CS1028非預期的前置處理器指示詞
  • CS1038預期 #endregion 指令
  • CS1040前置處理器指示詞必須顯示為行上的第一個非空格字元
  • CS1517無效的前置處理器運算式
  • CS1633無法辨識的 #pragma 指示詞
  • CS1696預期為單行註解或結束行
  • CS8996預處理器指令中不允許原始字串常值

這些錯誤表示您對 前置處理器指示詞使用了無效的語法。 常見原因包括:

  • # 之後使用未識別的指示 (CS1024, CS1633)。
  • 包括指令行上的多行註解 (CS1025、CS1696)。
  • 在非預期的位置使用指令 (CS1028)。
  • 遺漏必要的比對指示詞 (CS1027、CS1038)。
  • 未定義或取消定義符號作為檔案中的第一個標記 (CS1032)
  • 未將指令放在行首的第一個符號(CS1040)。
  • 在條件式編譯中使用無效的運算式 (CS1517)。
  • 在前置處理器指示詞中使用原始字串常值 (CS8996)。

CS1024 範例 - 需有前置處理器指令:

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

CS1025 範例 - 預期出現單行註解或行尾標記:

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

CS1027 範例 - 預期 #endif 指令:

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

CS1028 範例 - 非預期的前置處理器指令:

#endif   // CS1028 - no matching #if

CS1032 範例 - #define#undef 前置處理器指令必須出現在其他標誌之前:

/* Comment */ 
#define X   // CS1032 - directive not first token in file

CS1038 範例 - 預期 #endregion 指示詞:

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

CS1040 範例 - 前置處理器指示詞必須顯示為第一個非空格字元:

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

CS1517 範例 - 無效的前置處理器運算式:

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

CS1633 範例 - 無法辨識的 #pragma 指示詞:

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

CS8996 範例 - 在前置處理器指令中不允許使用原始字串文字:

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

若要修正此錯誤,請使用一般字串文字:

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

若要修正這些錯誤,請確定您的預處理器指引遵循前 置處理器指引檔案中所述的正確語法規則。

#error 和 #warning 指令錯誤

  • CS1029#error:「文字」
  • CS1030#warning:「文字」
  • CS1634預期禁用或恢復
  • CS1635無法還原警告「警告代碼」,因為它已全域停用
  • CS1691「number」不是有效的警告號碼
  • CS1692號碼無效

當編譯器處理 #error#warning#pragma warning 指引時,會發生這些錯誤。 這些指引可讓您在編譯期間產生自訂錯誤和警告訊息,並控制警告行為。

CS1029 顯示由 #error 指令定義的錯誤文字:

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

編譯會產生下列輸出:

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

CS1030 顯示由 #warning 指令定義的警告文字:

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

編譯會產生下列輸出:

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

CS1634 會在子句格式不正確時 #pragma warning 發生,例如省略停用或還原時:

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

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

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

當您使用/nowarn或專案設定全局停用警告,但嘗試使用#pragma warning restore還原該警告時,就會發生CS1635

// 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
    }
}

當傳遞至指示詞的數字不是有效的警告號碼時,就會發生 #pragma warning

// 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
    }
}

當在預處理器指令中的數字(例如 #pragma)無效時,就會觸發 #line,可能原因是數字過大、格式錯誤或包含非法字符:

// CS1692.cs

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

class A
{
    static void Main()
    {
    }
}

這些指示詞適用於條件式編譯案例,您想要警示開發人員程式碼中的特定條件,或控制編譯期間顯示的警告。 如需使用這些指引的詳細資訊,請參閱 前置處理器指引檔#pragma 警告

#line 和檔案指令錯誤

  • CS1560為前置處理器指示詞指定的檔名無效。檔案名稱太長或不是有效的檔案名稱
  • CS1576為 #line 指令所指定的行號遺失或無效
  • CS1578檔案名稱、單行註解或預期行尾
  • CS1694針對前置處理器指示詞指定的檔名無效。檔案名稱太長或不是有效的檔案名稱
  • CS1695#pragma 校驗碼語法無效;應該是 #pragma checksum "filename" "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" "XXXX..."
  • CS1709為前置處理器指示詞指定的檔名是空的
  • CS8938#line 指示詞值遺失或超出範圍
  • CS8939#line 指示詞結束位置必須大於或等於起始位置
  • CS9028#line 範圍指令需要在第一個括號之前、字元位移之前和檔名之前加上空格

這些錯誤表示使用#line指令或與檔案相關的前置處理器指令不正確。 常見原因包括:

  • 檔案名稱無效或遺失 (CS1560、CS1694、CS1709)。
  • 行號格式或值不正確 (CS1576、CS8938、CS8939)。
  • 缺少檔案名稱和註解的正確語法 (CS1578)。
  • 語法格式錯誤 #pragma checksum(CS1695)。
  • span 指令中的 #line 間距不正確 (CS9028)。

CS1560/CS1694 範例 - 指定的檔名無效:

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

CS1576 範例 - 行號遺失或無效:

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

CS1578 範例 - 預期的檔案名稱、註解或行尾:

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

CS1695 範例 - 無效的 #pragma 總和檢查碼語法:

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

CS1709 範例 - 空白檔案名稱:

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

CS8938 範例 - #line 指示詞值遺失或超出範圍:

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

CS8939 範例 - #line 結束位置錯誤:

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

CS9028 範例 - #line 範圍指令的空格設置:

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

若要修正這些錯誤,請確定您的 #line 指示詞和檔案相關的前置處理器指示詞遵循前 置處理器指示詞文件中所述的正確語法。

不正確使用檔案型應用程式指令

  • CS9297#: 指令不能出現在檔案中的第一個語法單位之後
  • CS9298#: 指令只能用於檔案型程式 (-features:FileBasedProgram)
  • CS9299#:指令不能位於#if指令之後
  • CS9314#! 指令只能用於腳本或基於檔案的程式

這些錯誤表示您不正確地使用 #: 檔案型應用程式的指令。 您可以在檔案型應用程式一節中有關前 置處理器指示詞 的文章中進一步了解這些指示詞的語法。 或者,您可以按照基於文件的應用程序的 教程 來探索基於文件的應用程序。

檔案包含 script.cs 指令

下列錯誤指出已編譯 script.cs C# 檔案中的語法:

  • CS7009檔案中第一個語彙單元後不可以使用 #r
  • CS7010預期為以引號括住的檔案名稱
  • CS7011只有腳本中才允許 #r
  • CS8097腳本中只允許 #load

已編譯的 C# 不支援這些指示詞。 您必須移除它們,或使用 script.cs