gpt4 book ai didi

vb.net - VB.NET为什么不给出与C#相同的 “field initializer can' t引用“非静态成员”警告?

转载 作者:行者123 更新时间:2023-12-02 10:46:54 25 4
gpt4 key购买 nike

我被这样编写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

该程序遵循的顺序是:
  • 将“DoesntWork”设置为由
    TextBox1和TextBox2(但尚未初始化,因此它们是
    两者都没有)。
  • 由于“作品”没有初始值,因此没有
    组。
  • 然后调用“InitializeComponent()”方法(写在
    “Form1.Designer.vb”文件(用于初始化TextBox1和TextBox2,
    而不是“doesntwork”的列表,因为它已经被初始化
    包含2个NOTHING引用)。
  • 设置“Works”变量。
  • 结束“New()”方法。
  • 关于vb.net - VB.NET为什么不给出与C#相同的 “field initializer can' t引用“非静态成员”警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24999904/

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