【C#エラー】静的でないフィールド、メソッド、またはプロパティ ‘××’ で、オブジェクト参照が必要です。解決方法【CS0120】
C#で発生するエラー
CS0120: 静的でないフィールド、メソッド、またはプロパティ '××’ で、オブジェクト参照が必要です
上記のコンパイルエラーの解決方法をご紹介します。
下記にC#で発生する例外処理の一覧をまとめていますので解決できない場合は合わせてご確認ください。
⇒例外処理クラス一覧まとめ【原因と解決方法】
C#のおすすめ講座を受講して、最短1週間でC#をマスターしよう!
⇒C#が学べるおすすめプログラミングスクール&オンライン講座11選
【原因1】 フィールド、メソッド、またはプロパティをオブジェクト化していない
「CS0120: 静的でないフィールド、メソッド、またはプロパティ '××’ で、オブジェクト参照が必要です。」
のコンパイルエラーの原因1つ目は
クラスをインスタンス化せずメソッドを直接呼び出している
からです。
【原因1】クラスをインスタンス化せずメソッドを直接呼び出している
エラーコードを例に具体的に確認してみましょう。
class Program
{
public int fieldNum;
public int AdditionalNum(int x, int y)
{
return x + y;
}
static void Main(string[] args)
{
fieldNum = 10; //CS0120エラーが発生。インスタンスから呼び出さないとエラー。
int a = AdditionalNum(2 , 3);//CS0120エラーが発生。インスタンスから呼び出さないとエラー。
}
}
Main(string[] args)でメンバー変数の「fieldNum」に10を代入しようとしてエラーが発生しています。
また、メソッド「AdditionalNum」を呼び出した時にもエラーが発生しています。
エラーが発生する原因はクラスをインスタンス化していないからです。
インスタンス化とは「クラス(設計図)からオブジェクト(物体)を作成すること」です。
クラスだけだと設計図があるだけ。メソッドやフィールド使用できません。
下記のようにインスタンス化する必要があります。
//インスタンス化
クラス名 変数名 = new クラス名();
インスタンス化を行うとメソッドやフィールドを使用できます。
【原因1の解決】クラスをインスタンス化した後にメソッドを呼び出す
実際にクラスをオブジェクト化(物体)し、インスタンス化しましょう。
class Program
{
public int fieldNum;
public int AdditionalNum(int x, int y)
{
return x + y;
}
static void Main(string[] args)
{
Program program = new Program(); //クラスを使ってインスタンス化する。
program.fieldNum = 10; //オブジェクトから変数を呼び出す。CS0120エラーが解消される。
int a = program.AdditionalNum(2 , 3);//オブジェクトからメソッドを呼び出す。CS0120エラーが解消される。
}
}
//インスタンス化例
Program program = new Program();
program.fieldNum = 10;
int a = program.AdditionalNum(2 , 3);
上記のようにインスタンス化した後に変数やメソッドを呼び出すとエラーを解消できます。
【原因2】 静的でないフィールド、メソッド、またはプロパティを使用している
「CS0120: 静的でないフィールド、メソッド、またはプロパティ '××’ で、オブジェクト参照が必要です。」
のコンパイルエラーの原因2つ目は
フィールドやメソッドを静的にしていない
からです。
【原因2】フィールドやメソッドを静的にしていない
エラーの原因のもう一つが「フィールドもしくはメソッドを静的にしていない」からです。
エラーコードを例に具体的に確認してみましょう。
class Program
{
public int fieldNum;
public int AdditionalNum(int x, int y)
{
return x + y;
}
static void Main(string[] args)
{
fieldNum = 10; //CS0120エラーが発生。
int a = AdditionalNum(2 , 3);//CS0120エラーが発生。
}
}
静的とは、特定のインスタンスにではなく、クラスに属するフィールドやメソッドのことです。
情的なクラスやメソッドは、インスタンス化しなくても使用することができます。
変数の静的化
static クラス名 変数名 = 値;
(例)public static int fieldNum;
メソッドの静的化
static void メソッド名(){}
(例)public static int AdditionalNum(int x, int y)
上記のように型名の前に「static」と記載すれば、変数やメソッドを静的化させることができます。
【原因2の解決】変数やメソッドを静的化する
実際に変数やメソッドを静的化しましょう。
class Program
{
public static int fieldNum;//「static」を用い変数を静的化する
public static int AdditionalNum(int x, int y) //「static」を用いメソッドを静的化する
{
return x + y;
}
static void Main(string[] args)
{
fieldNum = 10; //CS0120エラーが解消される。
int a = AdditionalNum(2 , 3);//CS0120エラーが解消される。
}
}
上記のように静的化すると、別の処理で使用してもエラーが解消されます。
「CS0120: 静的でないフィールド、メソッド、またはプロパティ '××’ で、オブジェクト参照が必要です」の詳細はこちらから
エラーを解決できなくて途方に暮れている人へ。
■無料プログラミング講座を開設しています!
下記にVisual Studioを使ったC#プログラミング初心者向け完全ガイドを掲載しています。
このガイドを一通り勉強すれば、C#プログラミングの基礎が学べます。
是非チャレンジしてみてください!
プログラミング初心者の方はぜひチャレンジしてみてください!!