gpt4 book ai didi

c# - 非静态字段、方法或属性需要对象引用

转载 作者:行者123 更新时间:2023-11-30 15:20:27 25 4
gpt4 key购买 nike

我知道之前有人问过这个问题,但场景过于具体,我对基本原理感到困惑。

我有两个基本版本的 C# 程序,一个可以运行,一个不能运行。如果有人能解释为什么我在第二个程序中收到错误非静态字段、方法或属性需要对象引用,我会很高兴。

作品:

namespace Experiments
{
class Test
{
public string myTest = "Gobbledigook";

public void Print()
{
Console.Write(myTest);
}
}

class Program
{
static void Main(string[] args)
{
Test newTest = new Test();
newTest.Print();
while (true)
;
}
}
}

不起作用:

namespace Experiments
{
class Test
{
public string myTest = "Gobbledigook";

public void Print()
{
Console.Write(myTest);
}
}

class Program
{
public Test newTest = new Test();

static void Main(string[] args)
{
newTest.Print();
while (true)
;
}
}
}

当我在第二个程序中尝试 Print() 来自 Test() 类的文本时,出现错误 An object reference is required对于非静态字段、方法或属性,我不明白为什么。我可以看出它与我声明 Test() 类实例的位置有关,但我不记得在 C++ 中发生过这样的事情,所以这让我很困惑。

这是怎么回事?

最佳答案

不是因为类的定义,而是关于关键字static的用法.

Test 类的 newTest 对象是 Program 类的公共(public)成员,main 是程序类中的静态函数。并且在报错信息中明确提到An object reference is required for the non-static method。因此,您需要将 newTest 对象声明为静态对象,以便在像 main 这样的静态方法中访问它们。

像这样

 public static Test newTest = new Test();

附加说明

假设您在 Test 类中将方法 Print 定义为 static,如下所示:

 public static void Print()
{
Console.Write(myTest);
}

那么您就不能像您当前使用的那样调用该方法(newTest.Print();)。而不是你必须使用 Test.Print();,因为 不能通过实例引用静态成员。相反,它是通过类型名称引用的。例如,考虑以下类

关于c# - 非静态字段、方法或属性需要对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40145070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com