Code Fix

初級

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  }
Program.cs(4,34): error CS0120: An object reference is required for the non-static field, method, or property 'Program.value'

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  }
Program.cs(4,9): error CS0120: An object reference is required for the non-static field, method, or property 'Program.Hello()'

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  }
Program.cs(7,34): error CS0120: An object reference is required for the non-static field, method, or property 'Program.count'

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  }
Program.cs(4,34): error CS0120: An object reference is required for the non-static field, method, or property 'Program.level'

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  }
Program.cs(4,9): error CS0120: An object reference is required for the non-static field, method, or property 'Program.Show()'

Showはインスタンスメソッドです。static文脈からクラス名で直接呼び出すことはできません。

直し方: Program を new Program() にします。

この問題を解いてみる →

よくある誤解

staticなMainメソッドから、クラスに属する(staticでない)フィールドやメソッドへ直接アクセスすることはできません。インスタンスを作る必要があります。

実務での勘所

C# 9以降の新しいプロジェクトテンプレートでは、トップレベルステートメントという書き方によりstatic void Main(...)という記述そのものが省略できます。このため、コードのどこにもstaticという文字が見当たらないのに、内部的にはファイル全体が暗黙のstatic Mainメソッドとしてコンパイルされており、同じ制約がそのまま働きます。「staticなんて書いていないのにこのエラーが出る」という戸惑いは、この省略のせいで発生します。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)