In a previous question我询问了主题标题错误消息,答案几乎是显而易见的。
然而,“煮沸”的例子来自一些不那么稀释的代码,现在原来的问题在我的新汤中再次出现。
我怀疑我可能会对很多“有趣”的评论开放,但是嘿......没有愚蠢的问题,只有愚蠢的程序员!“
无论如何,这是原始代码的一个只是略微煮沸的版本:
public partial class Form1 : Form
{
public static Form1 mForm = new Form1();
// define textbox parameter structure
struct ParmStruct
{
public TextBox sTextBoxName;
public double dMinValue;
public double dMaxValue;
public ParmStruct(TextBox sTextBoxName, double dMinValue, double dMaxValue)
{
this.sTextBoxName = sTextBoxName;
this.dMinValue = dMinValue;
this.dMaxValue = dMaxValue;
}
}
// Create list of Parameters (name, min, max)
static ParmStruct[] ParmList = new ParmStruct[]
{
new ParmStruct { sTextBoxName = mForm.textBox1, dMinValue = -99, dMaxValue = 99 },
new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 }
};
public Form1()
{
InitializeComponent();
this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
TextBox tb1;
tb1 = mForm.textBox1;
tb1 = textBox2;
double x = ParmList[0].dMaxValue;
}
}
ParmList初始化(sTextBoxName = textBox2)
的第二行将无法编译,除非我将其sTextBoxName = mForm.textBox2.
但是,行tb1 = textBox2
将编译,而不需要mForm。前缀。
这是最初引起混淆的实际案例(就我而言仍然如此)。
不确定为什么编译器(VS 2010)可以在一个案例中找到它而不是另一个案例。
哦......代码在编译时确实有效。 :)
答案 0 :(得分:2)
这是一个问题。
// Create list of Parameters (name, min, max)
static ParmStruct[] ParmList = new ParmStruct[]
{
new ParmStruct { sTextBoxName = mForm.textBox1, dMinValue = -99, dMaxValue = 99 },
new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 }
};
在Form1
的所有实例(这是static
关键字的作用)之间共享此变量没有任何意义,因为表单的每个实例都有自己的唯一textBox2
。此外,正如克里斯所建议的那样,简单地删除static
关键字也不是一个修复方法。在textBox2
创建之前,您无法引用InitializeComponent
,而Form1
内部会发生这种情况(由// list of Parameters (name, min, max)
ParmStruct[] ParmList;
public Form1()
{
InitializeComponent();
// now the textboxes exist and can be associated with the structure
ParmList = new ParmStruct[] {
new ParmStruct { sTextBoxName = textBox1, dMinValue = -99, dMaxValue = 99 },
new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 }
};
this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
}
构造函数调用)。这会更好:
textBox1_TextChanged
在构造函数和textBox1
方法中,您可以在没有任何进一步限定的情况下引用textBox2
和this
,编译器将找到属于this.textBox1
对象的那些就像你输入mForm
一样(参见例如构造函数的最后一个)。编译器不会使用mForm
中的文本框。事实上,静态{{1}}字段没有理由,因为没有代码可以显示它。
答案 1 :(得分:0)
textBox2是一个仅存在于mForm上下文中的对象,因此您必须将其作为mForm的字段进行范围,因为它尚未在您的方法中声明或作为类中的[静态]对象。