C#のTop-Level Statementでハマった話

.NET5.0のコンソールアプリケーションを.NET6.0にアップグレードしてTop-Level Statementを利用しようとしたときに起きた問題です。

最上位レベルのステートメントが含まれているファイルには、そのファイルの最後の最上位レベルのステートメントの後に、名前空間と型を含めることもできます。

docs.microsoft.com

これめちゃくちゃ重要な文言でしたが見落とし、ハマってしまいました。

起きたこと

.NET5.0で作成した以下のようなコードがありました。

using System;

namespace MyProject
{
    public static class Program
    {
        public static void Main(string args[])
        {
                Console.WriteLine("Hello World!");  // 例です
        }
    }
}

プロジェクトファイルを net6.0 にし、こうしました。

using System;

namespace MyProject;

Console.WriteLine("Hello World!");  // 例です

はい、コンパイルエラーになりました。

解決方法

公式ドキュメントにあるように、 そのファイルの最後の最上位レベルのステートメントの後に、名前空間と型を含め ましょう。

最初、何がダメなのか分かりませんでしたが、Top-Level Statementは端的に言うとProgram.csの名前空間、クラス名、Mainメソッドを省略出来る記法なので省略しなければだめですね。

例文でいえば、 namespace MyProject; が不要、もしくは最後尾行にこなければなりません。