我被这样编写VB.NET代码咬了好几次:
Public Class Form1
Private DoesntWork As New List(Of TextBox)({TextBox1, TextBox2})
Private Works As List(Of TextBox)
Public Sub New()
InitializeComponent()
Works = New List(Of TextBox)({TextBox3, TextBox4})
End Sub
End Class
其中
DoesntWork
初始化为具有两个成员的列表,尽管初始化程序表示它们应为TextBox1和TextBox2(当然是窗体上的控件),但两个成员均为Nothing
。等效的C#代码:
public partial class Form1 : Form
{
private List<TextBox> DoesntWork = new List<TextBox>(){textBox1, textBox2};
private List<TextBox> Works;
public Form1()
{
InitializeComponent();
this.Works = new List<TextBox>(){textBox3, textBox4};
}
}
给出错误
Error: A field initializer cannot reference the non-static field, method, or property 'WindowsFormsApplication1.Form1.textBox1'
为什么VB编译器没有给出相同的错误?相反,它在运行时崩溃,这显然更糟。
最佳答案
Kvermeer,它是“简单的”。 VB类在调用“New()”方法时初始化变量。在这种情况下,当“New()”方法创建类时,它将其值设置为“{TextBox1,TextBox2}”,但尚未调用“InitializeComponents()”方法,因此“TextBox1”和“TextBox2” ”仍然没有。
在您写的类(class)中:
Public Class Form1
Private DoesntWork As New List(Of TextBox)({TextBox1, TextBox2})
Private Works As List(Of TextBox)
Public Sub New()
InitializeComponent()
Works = New List(Of TextBox)({TextBox3, TextBox4})
End Sub
End Class
该程序遵循的顺序是:
TextBox1和TextBox2(但尚未初始化,因此它们是
两者都没有)。
组。
“Form1.Designer.vb”文件(用于初始化TextBox1和TextBox2,
而不是“doesntwork”的列表,因为它已经被初始化
包含2个NOTHING引用)。
关于vb.net - VB.NET为什么不给出与C#相同的 “field initializer can' t引用“非静态成员”警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24999904/