Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel behandelt die folgenden Compiler-Fehler und -Warnungen:
- CS0017: Der Programm "Ausgabedateiname" hat mehr als einen Einstiegspunkt definiert. Kompilieren Sie mit /main, um den Typ anzugeben, der den Einstiegspunkt enthält.
- CS0028: "Funktionsdeklaration" hat die falsche Signatur als Einstiegspunkt.
- CS0402: "Bezeichner": Ein Einstiegspunkt kann nicht generisch sein oder in einem generischen Typ deklariert werden.
- CS1555: Für die Main-Methode angegebene "Klasse" konnte nicht gefunden werden.
- CS1556: "Konstrukt" für die Main-Methode muss eine gültige Klasse oder Struktur sein.
- CS1557: 'Class' kann nicht für die Main-Methode verwendet werden, da sie sich in einer anderen Ausgabedatei befindet.
- CS1558: "Class" verfügt nicht über eine geeignete statische Main-Methode.
- CS1559: 'Object' kann nicht für die Main-Methode verwendet werden, da sie importiert wird.
- CS2017: "/main" kann nicht angegeben werden, wenn ein Modul oder eine Bibliothek erstellt wird.
- CS5001: Das Programm enthält keine statische "Main"-Methode, die für einen Einstiegspunkt geeignet ist.
- CS7022: Der Einstiegspunkt des Programms ist globaler Code; der Einstiegspunkt wird{0} ignoriert.
- CS8801: In einer Anweisung auf oberster Ebene in diesem Kontext deklarierte lokale Variable oder lokale Funktion '{0}' kann nicht verwendet werden.
- CS8802: Nur eine Kompilierungseinheit kann Anweisungen auf oberster Ebene aufweisen.
- CS8803: Anweisungen der obersten Ebene müssen Namespace- und Typdeklarationen vorausgehen.
- CS8805: Programm mit Anweisungen der obersten Ebene muss eine ausführbare Datei sein.
- CS8899: Anwendungseinstiegspunkte können nicht mit "UnmanagedCallersOnly" zugeordnet werden.
- CS8937: Mindestens eine Anweisung auf oberster Ebene muss nicht leer sein.
Main Methodendeklaration
- CS0017: Der Programm "Ausgabedateiname" hat mehr als einen Einstiegspunkt definiert. Kompilieren Sie mit /main, um den Typ anzugeben, der den Einstiegspunkt enthält.
- CS0028: "Funktionsdeklaration" hat die falsche Signatur als Einstiegspunkt.
- CS0402: "Bezeichner": Der Einstiegspunkt darf nicht generisch sein oder in einem generischen Typ enthalten sein.
- CS1558: "Class" verfügt nicht über eine geeignete statische Main-Methode.
- CS5001: Das Programm enthält keine statische "Main"-Methode, die für einen Einstiegspunkt geeignet ist.
- CS8899: Anwendungseinstiegspunkte können nicht mit "UnmanagedCallersOnly" zugeordnet werden.
Ein Programm, das zu einer ausführbaren Datei kompiliert wird, muss eine gültige Main Methode als Einstiegspunkt enthalten. Weitere Informationen finden Sie unter Main() und Befehlszeilenargumente.
Um diese Fehler zu beheben, stellen Sie sicher, dass die Main Methodendeklaration die folgenden Regeln erfüllt:
- Deklarieren Sie die
MainMethode wiestaticbei einem Rückgabetyp vonvoid,int, oderTaskTask<int>, da für die Laufzeit eine bestimmte Signatur erforderlich ist, um den Einstiegspunkt des Programms (CS0028, CS1558) zu identifizieren. Die Methode kann optional einenstring[]Parameter für Befehlszeilenargumente akzeptieren. Wenn Sie denasyncModifizierer verwenden, muss der RückgabetypTaskoderTask<int>sein, und Sie müssen die C#-Sprache Version 7.1 oder höher verwenden. - Verschieben Sie die
MainMethode aus einem generischen Typ, da die Laufzeit keinen eindeutigen Einstiegspunkt auflösen kann, wenn der enthaltende Typ Typargumente erfordert (CS0402). - Entfernen Sie das UnmanagedCallersOnlyAttribute Attribut aus der
MainMethode, da Einstiegspunkte aus verwaltetem Code aufgerufen werden können müssen, undUnmanagedCallersOnlybeschränkt die Methode nur auf nicht verwaltete Aufrufer (CS8899). - Wenn Ihr Code mehrere
MainMethoden über verschiedene Typen hinweg enthält, verwenden Sie die StartupObject-Compileroption , um anzugeben, welcher Typ den vorgesehenen Einstiegspunkt (CS0017) enthält. Ohne diese Option kann der Compiler nicht bestimmen, welcheMainMethode verwendet werden soll. - Stellen Sie sicher, dass das ausführbare Projekt eine
MainMethode mit einer korrekten Signatur definiert, da für ein Projekt mit einem OutputType von exe oder winexe ein Einstiegspunkt (CS5001, CS1558) erforderlich ist. Bei dem Methodennamen wird die Groß-/Kleinschreibung beachtet.mainqualifiziert sich nicht. Wenn Sie keine ausführbare Datei benötigen, ändern Sie den Ausgabetyp in die Bibliothek.
Hinweis
CS0028 ist eine Ältere Diagnose, die der aktuelle C#-Compiler nicht erzeugt. Moderne Versionen des Compilers melden stattdessen CS1558 oder CS5001, wenn die Methode Main eine ungültige Signatur hat.
Hinweis
CS0017, CS0028, CS0402, CS1558 und CS5001 werden nur während Build - oder Neuerstellungsvorgängen gemeldet. Sie werden während der Eingabe in der IDE nicht als IntelliSense-Diagnose angezeigt.
StartupObject Compileroption
- CS1555: Für die Main-Methode angegebene "Klasse" konnte nicht gefunden werden.
- CS1556: "Konstrukt" für die Main-Methode muss eine gültige Klasse oder Struktur sein.
- CS1557: 'Class' kann nicht für die Main-Methode verwendet werden, da sie sich in einer anderen Ausgabedatei befindet.
- CS1559: 'Object' kann nicht für die Main-Methode verwendet werden, da sie importiert wird.
- CS2017: "/main" kann nicht angegeben werden, wenn ein Modul oder eine Bibliothek erstellt wird.
Die StartupObject-Compileroption (auch bekannt als /main) gibt an, welcher Typ die Methode des Main Programms enthält, wenn mehrere Typen eine definieren. Weitere Informationen finden Sie unter StartupObject und Main() und Befehlszeilenargumente.
Um diese Fehler zu beheben, stellen Sie sicher, dass die StartupObject Option auf einen gültigen Typ verweist:
- Stellen Sie sicher, dass der vollqualifizierte Klassenname,
StartupObjectden Sie übergeben, einem Typ entspricht, der im Quellcode der aktuellen Kompilierung definiert ist. Der Compiler durchsucht nur die zu kompilierenden Quelldateien, nicht referenzierte Assemblys, nach dem angegebenen Typ (CS1555). Suchen Sie nach Tippfehlern im vollqualifizierten Namen, einschließlich des Namespaces. - Stellen Sie sicher, dass der an
StartupObjectübergebene Bezeichner sich auf einen nicht generischenclassoderstructbezieht. Der Compiler erfordert einen konkreten Typ, der eine gültigeMainMethode (CS1556) enthalten kann. Schnittstellen, Enumerationen, Delegaten und generische Typen sind keine gültigen Zielobjekte. - Verschieben Sie die angegebene Klasse in dieselbe Ausgabedatei wie die aktuelle Kompilierung. Die
/mainOption löst den Einstiegspunkt in einer einzelnen Ausgabeassembly auf und kann nicht auf Typen verweisen, die in einer anderen Ausgabe kompiliert wurden (CS1557). - Stellen Sie sicher, dass der angegebene Typ im Quellcode des aktuellen Projekts und nicht in einer Assembly definiert ist, auf die verwiesen wird. Der Compiler kann keinen importierten Typ als Einstiegspunkt (CS1559) festlegen.
- Entfernen Sie die
/mainOption beim Erstellen einer Bibliothek oder eines Moduls. Nur ausführbare Projekte (mit einem OutputType von exe oder winexe) haben Einstiegspunkte (CS2017). Wenn Sie einen Einstiegspunkt benötigen, ändern Sie den Ausgabetyp in eine ausführbare Datei. - Stellen Sie sicher, dass der durch
StartupObjectangegebene Typ eine gültigeMain-Methode deklariert. Wenn der Typ vorhanden ist, aber keine geeignete statischeMainMethode enthält, generiert der Compiler CS1558. Weitere Informationen finden Sie imMainAbschnitt "Methodendeklaration " für die erforderliche Signatur.
Hinweis
CS1557 und CS1559 sind Legacydiagnosen, die der aktuelle C#-Compiler nicht erzeugt. Die Szenarien, die diese Fehler ausgelöst haben, werden nicht mehr unterstützt oder treten zu selten auf, um die Erkennung zu gewährleisten.
Hinweis
CS1555 und CS1556 werden nur während Build - oder Neuerstellungsvorgängen gemeldet. Sie werden während der Eingabe in der IDE nicht als IntelliSense-Diagnose angezeigt.
Top-Level-Anweisungen
- CS7022: Der Einstiegspunkt des Programms ist globaler Code; der '{0}' Einstiegspunkt wird ignoriert.
- CS8801: In einer Anweisung auf oberster Ebene in diesem Kontext deklarierte lokale Variable oder lokale Funktion '{0}' kann nicht verwendet werden.
- CS8802: Nur eine Kompilierungseinheit kann Anweisungen auf oberster Ebene aufweisen.
- CS8803: Anweisungen der obersten Ebene müssen Namespace- und Typdeklarationen vorausgehen.
- CS8805: Programm mit Anweisungen der obersten Ebene muss eine ausführbare Datei sein.
- CS8937: Mindestens eine Anweisung auf oberster Ebene muss nicht leer sein.
Anweisungen der obersten Ebene ersetzen die explizite Main Methode als Einstiegspunkt des Programms. Weitere Informationen finden Sie in den Anweisungen auf oberster Ebene im C#-Programmierhandbuch und in der Featurespezifikation für Anweisungen auf oberster Ebene .
Um diese Fehler zu beheben, stellen Sie sicher, dass Ihre Verwendung von Anweisungen auf oberster Ebene die folgenden Regeln erfüllt:
- Konsolidieren Sie alle Anweisungen auf oberster Ebene in einer einzelnen Datei, da nur eine Kompilierungseinheit (Datei) Anweisungen der obersten Ebene (CS8802) enthalten kann. Verschieben Sie beliebigen Code der obersten Ebene aus anderen Dateien in diese einzelne Datei. Strukturieren Sie die verbleibenden Dateien so, dass sie nur Namespace- und Typdeklarationen enthalten.
- Platzieren Sie alle Anweisungen der obersten Ebene vor einer
namespaceodertypeDeklarationen in der Datei, da der Compiler zuerst Anweisungen der obersten Ebene (CS8803) erfordert. Wenn SieusingDirektiven haben, können diese Direktiven weiterhin Anweisungen auf oberster Ebene vorangehen. - Fügen Sie mindestens eine Anweisung ein, die ausführbaren Code enthält, da eine Datei mit nur leeren Anweisungen, Leerzeichen oder Kommentaren nicht als gültiger Einstiegspunkt (CS8937) gilt. Fügen Sie eine Anweisung wie einen Methodenaufruf, eine variable Zuordnung oder einen Ausdruck hinzu, um die Anforderung zu erfüllen.
- Greifen Sie auf lokale Variablen und lokale Funktionen, die in Anweisungen auf oberster Ebene deklariert sind, nur innerhalb des Kontexts der obersten Ebenenanweisung selbst zu, da diese Deklarationen auf die generierte Einstiegspunktmethode beschränkt sind und für andere Dateien oder für Typmitglieder, die in derselben Datei deklariert sind, nicht sichtbar sind (CS8801). Wenn Sie den Status für alle Dateien freigeben müssen, deklarieren Sie die Variable stattdessen als statisches Feld oder eine Eigenschaft für einen Typ.
- Legen Sie den OutputType des Projekts auf exe fest, da Anweisungen der obersten Ebene einen Einstiegspunkt definieren und Einstiegspunkte nur in ausführbaren Projekten (CS8805) gültig sind. Wenn Sie eine Bibliothek erstellen, entfernen Sie die Anweisungen der obersten Ebene, und verwenden Sie stattdessen Typen und Methoden.
- Entfernen oder umbenennen Sie eine explizite
MainMethode, wenn Anweisungen der obersten Ebene vorhanden sind, da der Compiler die Anweisungen der obersten Ebene als Einstiegspunkt behandelt und jedeMainMethode ignoriert, wodurch eine Warnung (CS7022) erzeugt wird. Wenn Sie eine expliziteMainMethode verwenden möchten, verschieben Sie den Code der Anweisung der obersten Ebene in diese Methode, und entfernen Sie die Anweisungen auf oberster Ebene.