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 にします。
よくある誤解
staticなMainメソッドから、クラスに属する(staticでない)フィールドやメソッドへ直接アクセスすることはできません。インスタンスを作る必要があります。
まとめ
static文脈からインスタンスメンバーへアクセスした原因は初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。