c# - "Non-nullable field is uninitialized"的编译器错误,即使已在InitializeComponents函数中对其进行了初始化

标签 c# winforms c#-8.0 nullable-reference-types

在WinForms中,常见的初始化函数是初始化引用变量(例如)

class SomeClass : Form {
  Button b;

  SomeClass() {
    InitializeComponents();
  }

  SomeClass(Container x) {
    InitializeComponents();
  }

  void InitializeComponents() {
    b = new Button();
  }
}

如您所见,b始终被初始化为非null值。但是,C#8仍然会提示SomeClass()没有初始化不可为空的值b。

当然,我可以将b标记为可为空(按钮?b),但是,由于未检查可为空性(它不能为null ...),因此现在我将对b的每次使用均发出警告。

解决此问题的最佳方法是什么。是否存在可用于将InitializeComponent标记为始终由构造方法调用的属性?

请注意,这是WinForms中的一种非常常见的模式(每个组件...)

尤瓦尔

最佳答案

按照preview docs:

Q: Why are warnings reported for fields that are initialized indirectly by the constructor, or outside the constructor?

A: The compiler recognizes fields assigned explicitly in the current constructor only, and warns for other fields declared as non-nullable. That ignores other ways fields may be initialized such as factory methods, helper methods, property setters, and object initializers. We will investigate recognizing common initialization patterns to avoid unnecessary warnings.



因此,现在没有办法 来实现您想要的目标,而无需将该分配直接移到构造函数中(或在声明它的行上分配它)。

关于c# - "Non-nullable field is uninitialized"的编译器错误,即使已在InitializeComponents函数中对其进行了初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55337871/

相关文章:

c# - 避免对具有可为空类型/字段的泛型发出警告的最佳方法?

c# - 如何安全地处理使用 await foreach 检索到的 IAsyncDisposable 对象?

c# circular flatten arrays 收藏

c# - 带有类型检查 C# 的更好的 If 语句

c# - ObservableCollection.Contains() 无法正常工作

c# - 计算机崩溃后 VS 2013 未加载 'Antlr3.Runtime' 程序集

c# - 在 rdlc 报告中创建嵌套的 tablix

c# - 如何在 Visual Studio C# 上将 MySql 中的列显示到 Windows 窗体文本框中?

c# - 仅在轴标签中显示整数?

c# - .net 核心中是否有任何公共(public) MemberNotNull/MemberNotNullWhen 属性