C# C VS2010-为什么我会收到“非静态字段需要对象引用”的消息?

C# C VS2010-为什么我会收到“非静态字段需要对象引用”的消息?,c#,C#,我将这个问题归结为一个非常简单的程序: public Form1() { InitializeComponent(); TextBox tb1; tb1 = textBox1; // this line is OK tb1 = this.textBox1; // this line is OK tb1 = Form1.textBox1; // this line generates error mess

我将这个问题归结为一个非常简单的程序:

public Form1()
{
    InitializeComponent();

    TextBox tb1;

    tb1 = textBox1;             // this line is OK
    tb1 = this.textBox1;        // this line is OK
    tb1 = Form1.textBox1;       // this line generates error message    

    }
如果将鼠标悬停在“textBox1”、“this.textBox1”和“Form1.textBox1”上,则在所有情况下,工具提示都会显示TextBox Form1.textBox1

有关显示工具提示的屏幕转储,请参见www.firish.com/tb1.jpg和www.firish.com/tb2.jpg


我在办公室里转转了一下,但这里没有人能真正解释为什么第三个示例没有编译,但除了“嗯嗯”,“嗯…”和几次耸肩之外没有得到太多其他信息。

因为Form1是类的名称,而不是Form1的实例

创建类时,代码如下所示

Form1 f = new Form1();
这里f是Form1类的实例,只要textbox1可见,就可以使用它

TextBox tb1 = f.TextBox1;

在类Form1中,可以使用关键字this引用当前实例,因为使用此语法只能访问静态成员。textBox1是一个动态成员,只能从初始化的对象访问它。myObject.textBox1。您正在尝试执行MyClass.textBox1。

textBox1是一个实例变量。它必须存在于对象的实例化副本中。当你说这样的话时就会发生这种情况:

Form1 form new Form1();
form.textBox1 = "Something";
如果不实例化该对象,它将使用静态调用,并且不能静态调用作为实例变量的对象

Form1.textBox1 = "Something"; // this fails.

在本例中,您使用的是构造函数。构造函数只有在对象被实例化时才会被调用,因此使用此函数或隐含的函数是可行的,但使用静态调用是不行的,因为没有实例可将变量分配给它。

我建议您需要找到其他开发人员一起工作。您的团队主要由VB.NET程序员组成吗?好的,伙计们,也许这是我应得的我们基本上都是大脑放屁,因为工具提示的描述让我们出轨了。但是谢谢大家,他们反应如此之快。啊,我的评论并不是对VB.NET程序员的轻蔑——我自己也是其中之一。但是,为了保持与VB 6的向后兼容性,VB.NET的实现方式略有不同,允许您在不首先创建Form1对象实例的情况下编写Form1.Show之类的内容。@user1408942:使用那些“嗯哼”,“嗯…”和几个耸肩,我认为你应该给精明的开发者提供一些工作机会。谢谢你,现在事情已经很清楚了。感谢所有其他人避免发布/滥发1000封感谢信: