Előfeldolgozási hibák és figyelmeztetések

A fordító a következő hibákat generálja az előfeldolgozási irányelvek helytelen használatához:

  • CS1024: Az előfeldolgozóra vonatkozó irányelv várható
  • CS1025: Egysoros megjegyzés vagy sorvég várható
  • CS1027: a #endif direktíva várható
  • CS1028: Váratlan előfeldolgozási irányelv
  • CS1029: #error: "text"
  • CS1030: #warning: „text”
  • CS1032: Nem definiálhatók/nem határozhatók meg az előfeldolgozó szimbólumok a fájl első tokenje után
  • CS1038: #endregion irányelv várható
  • CS1040: Az előfeldolgozási direktíváknak a sor első nem térközű karaktereként kell szerepelniük
  • CS1517: Érvénytelen előfeldolgozási kifejezés
  • CS1560: Az előfeldolgozási irányelvhez megadott fájlnév érvénytelen. A fájlnév túl hosszú vagy nem érvényes fájlnév
  • CS1576: A #line irányelvhez megadott sorszám hiányzik vagy érvénytelen
  • CS1578: Fájlnév, egysoros megjegyzés vagy sorvég várható
  • CS1633: Ismeretlen #pragma irányelv
  • CS1634: Várható letiltás vagy visszaállítás
  • CS1635: A figyelmeztetési kód nem állítható vissza, mert globálisan le lett tiltva
  • CS1691: A "szám" nem érvényes figyelmeztető szám
  • CS1692: Érvénytelen szám
  • CS1694: Az előfeldolgozási irányelvhez megadott fájlnév érvénytelen. A fájlnév túl hosszú vagy nem érvényes fájlnév
  • CS1695: Érvénytelen #pragma checksum szintaxisa; helyesen: #pragma checksum "filename" "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" "XXXX..."
  • CS1696: Egysoros megjegyzés vagy sorvég várható
  • CS1709: Az előfeldolgozási direktívához megadott fájlnév üres
  • CS7009: A fájl első jelszóeleme után nem használható #r
  • CS7010: Idézett fájlnév várható
  • CS7011: #r csak szkriptekben engedélyezett
  • CS8097: #load csak szkriptekben engedélyezett
  • CS8098: A fájl első karaktere után nem használható a #load
  • CS8301: Az előfeldolgozási szimbólum neve érvénytelen; A "szimbólum neve" nem érvényes azonosító
  • CS8938: A #line irányelv értéke hiányzik vagy a tartományon kívül esik
  • CS8939: A #line irányelv zárópozíciójának nagyobbnak vagy egyenlőnek kell lennie a kezdő pozíciónál
  • CS8996: A nyers karakterlánc literálok nem engedélyezettek az előfeldolgozási irányelvekben
  • CS9028: A #line span direktíva szóközt igényel az első zárójel előtt, a karakter eltolása előtt és a fájlnév előtt
  • CS9297: #: az irányelvek nem lehetnek a fájl első tokenje után
  • CS9298: #: az irányelvek csak fájlalapú alkalmazásokban használhatók (-features:FileBasedProgram)
  • CS9299: A #: irányelvek nem követhetik a #if irányelvet
  • CS9314: #! az irányelvek csak szkriptekben vagy fájlalapú alkalmazásokban használhatók
  • CS9378: '#!' A fájl első sorának első karakterének kell lennie

Érvénytelen előfeldolgozási irányelv szintaxisa

  • CS1024: Az előfeldolgozóra vonatkozó irányelv várható
  • CS1025: Egysoros megjegyzés vagy sorvég várható
  • CS1027: #endif irányelv várható
  • CS1028: Váratlan előfeldolgozási irányelv
  • CS1032: Nem definiálhatók/nem határozhatók meg az előfeldolgozó szimbólumok a fájl első tokenje után
  • CS1038: #endregion irányelv várható
  • CS1040: Az előfeldolgozási direktíváknak a sor első nem térközű karaktereként kell megjelennie
  • CS1517: Érvénytelen előfeldolgozási kifejezés
  • CS1633: Ismeretlen #pragma irányelv
  • CS1696: Egysoros megjegyzés vagy sorvég várható
  • CS8996: A nyers karakterláncliterálok nem engedélyezettek az előfeldolgozási utasításokban

Ezek a hibák azt jelzik, hogy érvénytelen szintaxist használt az előfeldolgozási irányelvekhez. A gyakori kiváltó okok között a következőket találjuk:

  • Az # után ismeretlen irányelv használata (CS1024, CS1633).
  • Többsoros megjegyzések belefűzve az irányelvsorokra (CS1025, CS1696).
  • Irányelvek használata váratlan helyeken (CS1028).
  • Hiányoznak a szükséges egyező irányelvek (CS1027, CS1038).
  • #define vagy #undef irányelv elhelyezése a fájl első tokenje után (CS1032).
  • Az utasítás nem kerül sorra mint sor első eleme (CS1040).
  • Érvénytelen kifejezések használata feltételes fordításban (CS1517).
  • Nyers sztringkonstansok használata az előfeldolgozási irányelvekben (CS8996).

CS1024-példa – Az előfeldolgozóra vonatkozó irányelv várható:

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

CS1025-példa – Egysoros megjegyzés vagy sorvég várható:

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

CS1027-példa – #endif irányelv várható:

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

CS1028-példa – Váratlan előfeldolgozási irányelv:

#endif   // CS1028 - no matching #if

CS1032-példa – #define és #undef előprocesszor-irányelveknek más jogkivonatok előtt kell megjelennie:

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

A hiba kijavításához helyezze az összes #define és #undef irányelvet a fájlban az első token elé:

#define X
#undef Y
class Test { }

CS1038-példa – #endregion irányelv várható:

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

CS1040-példa – Az előfeldolgozási irányelveknek az első nem üres szóköz karakterként kell megjelennie:

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

CS1517-példa – Érvénytelen előfeldolgozó kifejezés:

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

CS1633-példa – Ismeretlen #pragma irányelv:

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

CS8996 példa – A szó szerinti karaktersorozatok nem engedélyezettek az előfeldolgozó utasításokban:

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

A hiba kijavításához használjon egy normál sztringkonstanst:

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

A hibák kijavításához győződjön meg arról, hogy az előfeldolgozási irányelvek az előfeldolgozási irányelvek dokumentációjában leírt helyes szintaxisszabályokat követik.

Érvénytelen előfeldolgozó szimbólumnevek

  • CS8301: Az előfeldolgozási szimbólum neve érvénytelen; A "szimbólum neve" nem érvényes azonosító

Ha a(z) CSharpParseOptions elemet programkódból hozza létre, minden feltételes fordítási szimbólumot külön, azonosító formátumú névként adjon meg. Az első karakternek érvényesnek kell lennie egy C#-azonosító elején, a fennmaradó karaktereknek pedig érvényes azonosító karaktereknek kell lenniük. A Roslyn a kulcsszószöveget is elfogadja szimbólumnévként, de ne adjon hozzá előtagot @ . Ne tartalmazzon szóközt, írásjelet, például . vagy -, hozzárendelést, például FEATURE=1, vagy teljes feltételes kifejezést.

Az előfeldolgozási szimbólumok csak azt rögzítik, hogy a neve definiálva van-e. Nem tárol értéket. A DefineConstants projekttulajdonságon keresztül megadott nevek érvénytelenek, vagy a -define fordítási beállítás ehelyett CS2029-et hoz létre. Lásd : DefineConstants.

#error és #warning direktíva hiba

  • CS1029: #error: "text"
  • CS1030: #warning: "text"
  • CS1634: Várható letiltás vagy visszaállítás
  • CS1635: A figyelmeztetési kód nem állítható vissza, mert globálisan le lett tiltva
  • CS1691: A "szám" nem érvényes figyelmeztető szám
  • CS1692: Érvénytelen szám

Ezek a hibák akkor fordulnak elő, amikor a fordító feldolgozza a #error, #warning és #pragma warning irányelveket. Ezek az irányelvek lehetővé teszik egyéni hibaüzenetek és figyelmeztető üzenetek generálására a fordítás és a figyelmeztetési viselkedés szabályozása során.

A CS1029 megjeleníti az irányelvvel definiált hiba szövegét #error :

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

A fordítás a következő kimenetet hozza létre:

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

A CS1030 megjeleníti az irányelvvel definiált figyelmeztetés szövegét #warning :

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

A fordítás a következő kimenetet hozza létre:

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

A CS1634 akkor fordul elő, ha egy #pragma warning záradék hibásan van formázva, például ha a letiltás vagy a visszaállítás nincs megadva:

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

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

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

A CS1635 akkor fordul elő, ha a /nowarn parancssori opció vagy projekt beállítást használ egy figyelmeztetés globális letiltására, de a #pragma warning restore kapcsolót a figyelmeztetés visszaállítására használja:

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

A CS1691 akkor fordul elő, ha az #pragma warning irányelvnek átadott szám nem érvényes figyelmeztető szám:

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

A CS1692 akkor fordul elő, ha az előfeldolgozási irányelvekben #pragma#line szereplő szám érvénytelen, mert túl nagy, nem megfelelő formátumban van, vagy érvénytelen karaktereket tartalmaz:

// CS1692.cs

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

class A
{
    static void Main()
    {
    }
}

Ezek az irányelvek olyan feltételes fordítási helyzetekben hasznosak, amikor a fejlesztőket a kód meghatározott feltételeiről szeretné értesíteni, vagy szabályozni, hogy mely figyelmeztetések jelenjenek meg a fordítás során. Az irányelvek használatával kapcsolatos további információkért tekintse meg az előfeldolgozási irányelvek dokumentációját és #pragma figyelmeztetést.

#line és fájlirányelmezési hibák

  • CS1560: Az előfeldolgozási irányelvhez megadott fájlnév érvénytelen. A fájlnév túl hosszú vagy nem érvényes fájlnév.
  • CS1576: A #line irányelvhez megadott sorszám hiányzik vagy érvénytelen.
  • CS1578: Fájlnév, egysoros megjegyzés vagy sorvég várható.
  • CS1694: Az előfeldolgozási irányelvhez megadott fájlnév érvénytelen. A fájlnév túl hosszú vagy nem érvényes fájlnév.
  • CS1695: A #pragma ellenőrzőösszeg szintaxisa érvénytelen; helyesen: #pragma checksum "filename" "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" "XXXX...".
  • CS1709: Az előfeldolgozási direktívához megadott fájlnév üres.
  • CS8938: A #line irányelv értéke hiányzik vagy a tartományon kívül esik.
  • CS8939: A #line irányelv zárópozíciójának nagyobbnak vagy egyenlőnek kell lennie a kezdő pozíciónál.
  • CS9028: A #line span direktíva szóközt igényel az első zárójel előtt, a karakter eltolása előtt és a fájlnév előtt.

Ezek a hibák az irányelv vagy a #line fájlhoz kapcsolódó előfeldolgozási irányelvek helytelen használatát jelzik. A gyakori kiváltó okok között a következőket találjuk:

  • Érvénytelen vagy hiányzó fájlnevek (CS1560, CS1694, CS1709).
  • Helytelen sorszámformátum vagy értékek (CS1576, CS8938, CS8939).
  • Hiányzik a fájlnevek és megjegyzések megfelelő szintaxisa (CS1578).
  • Hibás szintaxis #pragma checksum (CS1695).
  • Nem megfelelő térköz a span irányelvekben #line (CS9028).

CS1560/CS1694 példa – Érvénytelen fájlnév van megadva:

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

CS1576-példa – Hiányzó vagy érvénytelen sorszám:

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

CS1578-példa – Fájlnév, megjegyzés vagy sorvég várható:

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

CS1695-példa – Érvénytelen #pragma ellenőrzőösszeg szintaxisa:

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

CS1709-példa – Üres fájlnév:

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

CS8938 példa – #line irányelv értéke hiányzik vagy tartományon kívül esik:

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

CS8939 példa – hibás #line pozíció végének:

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

CS9028 példa – #line tartomány direktíva hézag:

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

A hibák kijavításához győződjön meg arról, hogy az #line irányelvek és a fájlhoz kapcsolódó előfeldolgozási irányelvek a megfelelő szintaxist követik az előfeldolgozási irányelvek dokumentációjában leírtak szerint.

A fájlalapú alkalmazásokra vonatkozó irányelvek helytelen használata

  • CS9297: #: az irányelvek nem lehetnek az első token után a fájlban
  • CS9298: #: az irányelvek csak fájlalapú alkalmazásokban használhatók (-features:FileBasedProgram)
  • CS9299: A #: irányelvek nem lehetnek a #if irányelv után
  • CS9314: #! az irányelvek csak szkriptekben vagy fájlalapú alkalmazásokban használhatók
  • CS9378: '#!' A fájl első sorának első karakterének kell lennie

Ezek a hibák azt jelzik, hogy nem megfelelően használta a #: vagy #! irányelveket. Az irányelvek szintaxisával kapcsolatos további információkért tekintse meg a fájlalapú alkalmazásokról szóló szakaszban található , az előfeldolgozási irányelvekről szóló cikket. A fájlalapú alkalmazások megismeréséhez kövesse a fájlalapú alkalmazásokra vonatkozó oktatóanyagot .

A shebang (#!) kiválasztja a végrehajtható fájlt egy szkripthez vagy fájlalapú alkalmazáshoz. Helyezze az első sor első karakterére a szóköz, a megjegyzések vagy az üres sorok elé (CS9378); lásd a fájlalapú alkalmazás irányelvének útmutatását.

A fájl script.cs irányelveket tartalmaz

A következő hibák a C#-szkript irányelvek helytelen használatát vagy elhelyezését jelzik:

  • CS7009: Nem lehet használni a #r-t a fájl első szava után
  • CS7010: Idézett fájlnév várható
  • CS7011: #r csak szkriptekben engedélyezett
  • CS8097: #load csak szkriptekben engedélyezett
  • CS8098: A fájl első tokenje után nem használható a #load

Egy C#-szkriptben (.csx) a token után álló #load irányelv a(z) CS8098 hibát eredményezi:

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

A CS8098 javításához helyezze át az összes #load irányelvet a szkript minden tokenje elé:

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

Normál C#-forrásfájlban (.cs) #load nem engedélyezett. Ez a kapcsolódó feltétel a CS8097-et állítja elő, nem a CS8098-at. Távolítsa el #load a normál forrásfájlokat.