質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

3587閲覧

コンソールアプリケーションにてメンバ変数がエラー

04K

総合スコア5

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/08/25 03:51

編集2019/08/25 20:32

以下、コードです。
コメント部分に今回の疑問点を示しました。

class Program
{
// ここだと、
//「静的でないメソッド、フィールドまたプロパティProgram.kingで
// オブジェクト参照が必要」と出ます
int king = 12;   // メンバ変数として宣言・初期化

static void Main(string[] args) { // ここで宣言・初期化した場合は問題ない

     //int king = 12;
Console.WriteLine(king);
}
}

コンソールアプリケーションにて、
メインメソッドの外にメンバ変数を書くと
エラーになります。
静的でないとダメのようなエラー内容です。

クラス内に記載しているにもかかわらず
このようなエラーになる理由がわかりません。

教えてください。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

archiver

2019/08/25 03:57

どのようなコードを書いて、どのようなエラー(出力されているエラーそのもの)が出ているのかを示してくれませんか。 これだけだと、「何に詰まっている」のかが誰にもわからず、どう回答したらいいのかもわからないので。
guest

回答2

0

このようなエラーになる理由がわかりません。

以下のサンプルコードを見てください。サンプルはメソッドを例にとってますが、フィールド(質問者さんの言うメンバー変数?)、プロパティも同じです。

「これはダメ」とコメントアウトしたようなことをしているのだと思いますが、エラーになる理由は InstanceMethod は Program クラスのインスタンスメソッドだからです。

その下に書いたように Program p = new Program(); で Program クラスのインスタンスを作って、それに紐づけて p.InstanceMethod(); のように実行すればエラーにはならず、望む結果が得られると思います。

一方、StaticMethod メソッドの方は static キーワードを付与して静的メソッドにしていますので、Program.StaticMethod(); だけで呼び出せます(サンプルコードでは Program は省略して StaticMethod(); だけでも可)。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Program.StaticMethod(); // これはダメ // InstanceMethod(); Program p = new Program(); p.InstanceMethod(); } public static void StaticMethod() { Console.WriteLine("静的メソッドの呼び出し"); } public void InstanceMethod() { Console.WriteLine("インスタンスメソッドの呼び出し"); } // 結果は: // 静的メソッドの呼び出し // インスタンスメソッドの呼び出し } }

投稿2019/08/25 04:35

編集2019/08/25 04:42
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こちらの質問が参考になるかと
Mainメソッドにstaticがついてる理由 and staticがついてるメソッドから、staticがついていないメソッドが呼び出せない理由

私もSurferOnWwwさんもメソッドに対しての記述になっていますが、変数に対しても同様です。
staticで定義しない場合はインスタンス変数となり、インスタンスを生成しない限り実体は持ちません。
ですので、インスタンスを生成せずに呼び出すMain内ではメンバー変数のkingは実体を持ちませんし、初期化も行われていません。
Main内部で定義した場合は、その関数内に入った時に初期化されますのでアクセスできます。

投稿2019/08/25 03:59

編集2019/08/26 02:55
YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

04K

2019/08/28 11:53

Mainメソッドが実体としてあるから、それに従って変数も実体にする必要があるのでしょうか? PGについて理解度が低く申し訳ないです。
YAmaGNZ

2019/08/28 12:08

メンバー変数のkingはインスタンスを作成しないと実体が作られません。 プログラムの実行時にはProgramクラスのインスタンスは作成されずにMainメソッドが呼び出されます。 なので、インスタンスを指定しない方法でのアクセスに対してエラーとなります。 kingもstatic宣言すれば、インスタンスを生成しなくてもアクセスすることができます。
04K

2019/08/28 12:27

たしかにking変数もstatic指定ならエラーにはなりません。 実体としてあるかないか。ないならインスタンスで実体を作る必要がある。 わかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問