3

関連する質問がたくさんあるのに、探している答えを見つける/理解することができなかったときに、これを尋ねるのは申し訳ありません.

// 2. 通貨 X を通貨 Y に、またその逆に変換するプログラムを開発します。

using System;

class Problem2
{
    static void Main (string[] args)
    {
        while (true) {
            Console.WriteLine ("1. Currency Conversion from CAD to Won");
            Console.WriteLine ("2. Currency Conversion from Won to Cad");
            Console.Write ("Choose from the Following: (1 or 2)? ");
            int option = int.Parse( Console.ReadLine() );
            //double x;
            if (option == 1) {
                Console.WriteLine ("Type in the amount you would like to Convert CAD to Won: ");
                //double y =double.Parse( Console.ReadLine());
                //Console.WriteLine( cadToWon( y ) );
                Console.WriteLine( cadToWon( double.Parse( Console.ReadLine() ) ));
            }
            if (option == 2) {
                Console.WriteLine ("Type in the amount you would like to Convert Won to CAD: ");
                Console.WriteLine( wonToCad (double.Parse( Console.ReadLine())));
            }
        }
    }

    double cadToWon( double x )
    {
        return x * 1113.26;
    }

    double wonToCad( double x)
    {
        return x / 1113.26;
    }
}

これにより、「非静的フィールド、メソッド、またはプロパティ 'Problem2...にはオブジェクト参照が必要です...」というエラーメッセージが表示されます。なぜそれが必要なのか疑問に思っています (Main が静的だからだと思いますか?)、静的を追加せずにこれらのメソッドを使用するには、何を変更する必要がありますか?

ありがとうございました

4

5 に答える 5

4

Main メソッドは静的であるため、main から呼び出す場合は、cadToWon と winToCad静的である必要があります。

static double cadToWon(double x) //...


static double wonToCad(double x) //...

もう 1 つのオプションは、Main、cadToWon、および winToCad メソッドのすべてのロジックを新しいクラスに分割し、Mainメソッドでその新しいクラスをセットアップして実行することです。しかし、それはあなたの任務の範囲を超えているのではないかと思います。


static を追加するとこれが機能する理由についての質問に答えるには:

staticメソッドは、クラスのすべてのインスタンスで共有されます。したがって、クラスのどのインスタンスにいても、それらすべてで共有されるメソッドは 1 つProblem2だけです。 Main

cadToWonただし、インスタンスメソッドです。class の特定のインスタンスに属しますProblem2

その結果、 はのどのインスタンスを呼び出すかわからないため、 からcadToWon呼び出すことはできません。 どのインスタンスも呼び出さないため、どのインスタンスを呼び出すかわかりません。MainMainProblem2cadToWonMaincadToWonMainbelong

于 2012-10-21T16:47:37.827 に答える
0

これは、Main が静的であるため、Problem2 のどのインスタンスにも割り当てられていないためです。問題 2 のどのインスタンスで変数を送信するかがわからないため、正しいメソッドを呼び出すことができません。

現在、メソッドは Problem2 のフィールドを変更していません。しかし、彼らはできました、そしてそれが全体の問題です. 問題 2 のどのインスタンスを変更する必要がありますか? 静的メソッドにはそれを知る方法がありません。

したがって、Problem2 のインスタンスを初期化した場合は、静的 Main から独自のバージョンのメソッドを呼び出すことができます。

Problem2 problem = new Problem2();

problem.cadToWon(...)
于 2012-10-21T16:49:11.727 に答える
0

あなたの方法を作るstaticことは、その問題を解決します。static静的メソッド (例: ) からインスタンス メンバー (前に が付いていないもの) を呼び出すことはできませんstatic void main(..)。両方を宣言するstaticか、メソッドがあるクラスのインスタンスを作成し、インスタンスを介してそれらにアクセスする必要があります。ここでは必要ないと思います

static double cadToWon( double x )
{
    return x * 1113.26;
}

static double wonToCad( double x)
{
    return x / 1113.26;
}

インスタンス経由でアクセスする

Program2 p2 = new Program2();
double x = p2.wonToCad(10);
于 2012-10-21T16:50:19.570 に答える
-1

それらを静的に変更したくない場合は、単にそれらを別のクラスに移動し、Main 内でオブジェクトを作成して関数を使用します。

于 2013-08-02T14:50:08.050 に答える