static文脈からインスタンスメンバーへアクセスした原因
staticなMainからインスタンスメンバーへ直接アクセスしようとしたときに出ます。static/インスタンスの違いを理解する重要なつまずきポイントです。
エラーメッセージの読み方
Program.cs(4,34): error CS0120: An object reference is required for the non-static field, method, or property 'Program.value'
Program.cs- ファイル名
4- 行番号
34- 列番号 — この位置でコンパイラが解析に失敗しました
CS0120- エラーコード — 検索するとMicrosoftの解説ページが見つかります
An object reference is required for the non-static field, method, or property 'Program.value'- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 class Program { 2 int value = 10; 3 static void Main(string[] args) { 4 System.Console.WriteLine(Program .value); ^ 5 } 6 }
staticなMainからは、インスタンスを作らないとインスタンスフィールドにアクセスできません。
直し方: Program を new Program() にします。
パターン2
1 class Program { 2 void Hello() { System.Console.WriteLine("Hi"); } 3 static void Main(string[] args) { 4 Program .Hello(); ^ 5 } 6 }
Helloはインスタンスメソッドです。static文脈から直接クラス名で呼び出すことはできません。
直し方: Program を new Program() にします。
パターン3
1 class Program { 2 int count = 0; 3 void Increment() { count++; } 4 static void Main(string[] args) { 5 Program p = new Program(); 6 p.Increment(); 7 System.Console.WriteLine(Program.count); ^ 8 } 9 }
countはインスタンスpに属します。クラス名Programでは、どのインスタンスの値か特定できません。
直し方: Program を p にします。
パターン4
1 class Program { 2 int level = 5; 3 static void Main(string[] args) { 4 System.Console.WriteLine(Program .level); ^ 5 } 6 }
staticなMainからインスタンスフィールドへ直接アクセスすることはできません。
直し方: Program を new Program() にします。
パターン5
1 class Program { 2 void Show() { System.Console.WriteLine("Show"); } 3 static void Main(string[] args) { 4 Program .Show(); ^ 5 } 6 }
Showはインスタンスメソッドです。static文脈からクラス名で直接呼び出すことはできません。
直し方: Program を new Program() にします。
よくある誤解
staticなMainメソッドから、クラスに属する(staticでない)フィールドやメソッドへ直接アクセスすることはできません。インスタンスを作る必要があります。
実務での勘所
C# 9以降の新しいプロジェクトテンプレートでは、トップレベルステートメントという書き方によりstatic void Main(...)という記述そのものが省略できます。このため、コードのどこにもstaticという文字が見当たらないのに、内部的にはファイル全体が暗黙のstatic Mainメソッドとしてコンパイルされており、同じ制約がそのまま働きます。「staticなんて書いていないのにこのエラーが出る」という戸惑いは、この省略のせいで発生します。