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

标签 vb.net compiler-errors

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

    相关文章:

    c# - ITextSharp 压模损坏 pdf

    c - (为什么)Windows "Calc.exe"是否缺少 WndProc?

    c# - 操纵形式. Action

    c++ - 为什么 “std::isdigit”在Windows上的C++中报告 “no matching overloaded function”

    c++ - 为Raspbian jessie交叉编译qt5.5

    java - VPL 中的编译错误,但 Intellij 中没有(Java,大学作业)

    vb.net - 如何使用 VB.Net 2.0 在 ASP.Net 中处理季度(季度日期)?

    c# - 检查“在字符串 vb.net

    java - 未报告的异常IOException…必须被捕获或声明为引发

    compiler-errors - 格式字符串中要求的非负宽度