Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Warning CS7022 - The entry point of the program is global code; ignoring 'Program.Main(string[])' entry point

Tags:

c#-9.0

so I have an issue where I have this warning in my Error List:

Severity Code Description Project File Line Suppression State Warning CS7022 The entry point of the program is global code; ignoring 'Program.Main(string[])' entry point. Project DirectoryToProject 23 Active

This is essentially where its throwing

namespace MyProgram
{
    class Program
    {
        static async Task Main(string[] args) => await new Program.MainAsync();
    }
        static async Task MainAsync()
        {.. do stuff.. }
}

That is the line of code that is causing the error. I've tried playing around with the Main class, I did have it with the return type void and had my GetAwaiter and GetResult method called on the MainAsync method.

I've tried researching the error but I've had no luck, so hopefully, this thread will help a few others...

I am currently running on C# 9.0 Visual Studio 2019 Build Version: 16.8.30717.126

EDIT: Forgot to show that the MainAsync was in the file... (Sorry) Im trying to limit the amount of methods I show as 95% of them aren't useful the to question... But the issue is that although my application compiles, when executing my program it quits instantly as if it doesn't know where to start...

EDIT 2: Thanks to Hans Passant - If anyone experiences something like this try what he mentioned:

"This is a rather awful C# v9 feature. Project > Properties > Build tab, Advanced button > Language version = 7.3 You should now get a decent error message from the code you didn't know you had to post".

Essentially upon changing back to C# 8.0 I saw it was a different file hidden away causing the issue.

like image 203
Skyhighjinks Avatar asked Nov 28 '20 02:11

Skyhighjinks


People also ask

How do you fix program has more than one entry point defined compile with main to specify the type that contains the entry point?

Compile with /main to specify the type that contains the entry point. A program can only have one Main method. To resolve this error, you can either delete all Main methods in your code, except one, or you can use the StartupObject compiler option to specify which Main method you want to use.

Can c# Program run without Main method?

Starting in C# 9, you don't have to explicitly include a Main method in a console application project. Instead, you can use the top-level statements feature to minimize the code you have to write. In this case, the compiler generates a class and Main method entry point for the application.

What is a top-level statement?

Top-level statements do enable quick experimentation and beginner tutorials. They also provide a smooth path from experimentation to full programs. Top-level statements are executed in the order they appear in the file. Top-level statements can only be used in one source file in your application.


2 Answers

Starting with net5.0, I've found that this error can be caused by having stray semicolons above the namespace keyword. Whether this is a bug or intended behavior is beyond me, however make sure you don't have any standalone semicolons as such:

using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
; // This will cause CS7022

namespace Tomoe.Commands.Public

Be sure to check all your files and not just Program.cs

EDIT: Apparently this is intended behavior, see https://github.com/dotnet/roslyn/issues/53472. TL;DR, semicolons above namespaces are interpreted as top level statements. Because nothing is being called in said statement, the program exits. This is the same as doing

static void Main() { 
    ;
}

in your Program.cs. While I do feel some change should be made, the design decision behind this is quite logical and entirely understandable.

EDIT 2: According to jcouv on Github, this is now becoming an error instead of a warning. Hopefully, this "bug" shall harass us no more!

like image 58
Lunar Avatar answered Jan 04 '23 00:01

Lunar


As mentioned by others, this is caused by a new C# 9 feature that is called "Top-level statements". This Feature enables you to write statements in the global context and the compiler will create it's own Main() based on that.

In my case I had a semicolon after my using statements in any of my files. As far as I know Visual Studio or the compiler don't give you any option to find this "entry-point" without changing any settings as descripted by others in this thread. My solution was to just create another "Top-level statement entry point" in my project. Due to the fact that there is only one allowed the compiler complains about that. I just added a semicolon directly after the using statements in my Program.cs. Because this file is one of the first that are processed by the compiler any other file that contains a "Top-level statement" will cause an error.

like image 34
Wolfgang Mahringer Avatar answered Jan 03 '23 22:01

Wolfgang Mahringer