为什么我不能在另一个类中调用公共方法?

11

我已经使这两个类互动,并且正在尝试从第一个类中调用四个不同的类以在第二个类中使用。

这些方法是公共的,它们确实返回值,但由于某种原因没有建立连接。 当我尝试时,我得到的错误是:"需要对象引用才能访问非静态字段、方法或属性 'GradeBook。[我想要调用的方法]'"


我已经初始化了所有内容。我不想将这些方法设置为静态的。我再次阅读了我的任务细节,发现甚至不应该这样做,但无论我怎么尝试都似乎不能使它正常工作。

myGradeBook.[method] GraceBook.[method]

这一切似乎都会产生错误。

当前的错误:

The best overloaded method match or 'System.Console.WriteLine(string, object)' has some invalid arguments.

Arugment '2': cannot convert from 'method group' to 'object'

我甚至不确定它们的含义......

编辑: 我通过Visual Studio的Step Into功能解决了这个问题。 我不知道为什么要花这么长时间才使用它。


请添加更多的澄清,例如您是如何调用该方法的,它是静态方法还是实例方法等。否则,这个问题将被留给解释...祝一切顺利。 - rajesh pillai
1
嗯,从你的作业中我学到了一些东西... - discorax
4个回答

39

你试图在类上调用实例方法。要在类上调用实例方法,你必须创建一个实例来调用该方法。如果你想在非实例上调用该方法,请添加 static 关键字。例如:

class Example {
  public static string NonInstanceMethod() {
    return "static";
  }
  public string InstanceMethod() { 
    return "non-static";
  }
}

static void SomeMethod() {
  Console.WriteLine(Example.NonInstanceMethod());
  Console.WriteLine(Example.InstanceMethod());  // Does not compile
  Example v1 = new Example();
  Console.WriteLine(v1.InstanceMethod());
}

当我将要调用的方法更改为静态时,该方法内部的变量会变得混乱,并且我会收到更多的错误。我无法获胜。 - Harris
3
可以的——如果你想调用实例方法,请在实例上调用它。这是唯一有意义的方式。否则就像是要求“狗”奔跑,而不是要求特定的狗奔跑。 - Jon Skeet
为了我的好处,我有一个后续问题。在示例中,似乎可以调用静态方法而无需创建类的实例,这是真的吗?我会在周一尝试一下。感谢分享。 - discorax
@discorax,是的。可以完全合法地调用静态方法,而无需创建类的实例。 - JaredPar
3
“亲爱的,你今天早上遛狗了吗?” / “没有,但我走过了‘狗’这个概念。” - Daniel Earwicker
有没有不使用静态的方法来实现这个? - LazerStackr

12

听起来你没有实例化你的类。这是我收到“需要对象引用”的错误的主要原因。

MyClass myClass = new MyClass();

添加了那行代码后,您就可以调用您的方法。

myClass.myMethod();

另外,您的所有类都在同一个命名空间中吗?当我刚开始学习c#时,这是我常见的错误点。


2
+1 因为它看起来是正确的答案。谁给它点了踩,我希望他们能在这里留言。 - Karl
起初我以为这个可以工作,但后来在IDE中出现了递归错误,并在解决方案加载时崩溃了。这是一个很好的错误,但我现在必须找到替代方法。 VisualCues.Form1 myClass = new VisualCues.Form1(); myClass.ReadTheAPETag(myClass.ex); - vr_driver

4

你需要创建一个类型为该类的变量,并将其设置为对象的新实例。

GradeBook myGradeBook = new GradeBook();

然后在您刚刚创建的对象上调用该方法。

myGradeBook.[method you want called]

我的错,我在过度疲劳时误读了一些内容,并且当时正在 StackOverflow 上。现在我无法撤销我的投票了,真是遗憾。-( - JoshBerke
您可以再次点击下投票箭头来取消对该项的投反对票。 - Eric Ness

2
例如1和2,您需要创建静态方法:
public static string InstanceMethod() {return "Hello World";}

例如,对于示例3,您需要一个对象实例来调用该方法:
object o = new object();
string s = o.InstanceMethod();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接