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;
    }
}

这给了我错误消息“非静态字段,方法或属性'问题2需要对象引用......”我知道如果我在方法前面添加静态,我将能够运行程序但是我想知道为什么我需要它(我认为这是因为 Main 是静态的?)为了使用这些方法而不向它们添加静态,我需要更改什么?

谢谢

4

5 回答 5

4

由于您的 Main 方法是静态的,因此如果您想从 Main 调用cadToWon 和 wonToCad也必须是静态的。

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


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

另一种选择是将 Main、cadToWon 和 wonToCad 方法的所有逻辑分解为一个新类,然后让 Main 方法简单地设置并运行该新类。但我怀疑这可能超出了你的任务范围。


要回答您为什么添加静态可以使这项工作的问题:

static方法在类的所有实例之间共享。因此,无论Problem2您在哪个类实例中,都只有一种 Main方法可以在所有实例中共享。

cadToWon但是,是一个实例方法。它属于类的特定实例Problem2

结果,您不能调用cadToWonfrom Main,因为Main不知道要 调用哪个实例。不知道要调用什么实例,因为不调用任何实例。Problem2cadToWonMaincadToWonMainbelong

于 2012-10-21T16:47:37.827 回答
0

这是因为 Main 是静态的,没有分配给 Problem2 的任何实例。不知道在问题 2 的哪个实例发送变量,它无法调用正确的方法。

现在,您的方法不会修改任何 Problem2 的任何字段。但他们可以,这就是整个问题。他们应该修改 Problem2 的哪个实例?静态方法无法知道这一点。

因此,如果您已经初始化了 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 回答
0

这个解决方案正是这里所寻求的。试图将静态 Main 中的对象传递给 Class: Program 中的方法,如果没有:

 `Program ProgramInstance = new Program();
 ProgramInstance.ProcessObject(MyObject);`
于 2014-03-30T08:54:39.587 回答
-1

如果您不想将它们更改为静态,则只需将它们移动到另一个类,然后在 Main 创建一个对象并使用这些函数。

于 2013-08-02T14:50:08.050 回答