了解为什么我仍然在构造函数中遇到 CS8618 错误
Understanding why I'm still getting CS8618 Error In Constructor
我正在处理可为空的更改,但我遇到了一些提供 CS8618 的东西(可为空的字段必须包含非空),但我认为它不应该如此。
基本上我有一个私有字段,我的构造函数调用了一个 'init/setup etc' 方法,该方法确实设置了私有字段,但它并不开心。
即
public class Test
{
private object bob;
public Test()
{
Init();
}
private void Init()
{
bob = new object();
}
}
编译器将构造函数突出显示为错误。我能以某种方式告诉它 Init()
做它想做的事吗?还是我遗漏了什么,这意味着 Init()
在某些情况下可能不会被调用,这会使警告有效?
我在最后的地方尝试了一些 !
,但似乎并非如此。如果我将代码从 Init()
移到构造函数中,这个简单示例和我的代码中的错误就会消失。
根据@Jeroen Mostert 的评论,解决方案是向子方法添加属性 MemberNotNull
,如下所示:
public class Test
{
private object bob;
public Test()
{
Init();
}
[MemberNotNull(nameof(bob))]
private void Init()
{
bob = new object();
}
}
请注意,C# 的未来版本可能不需要这样做。
我正在处理可为空的更改,但我遇到了一些提供 CS8618 的东西(可为空的字段必须包含非空),但我认为它不应该如此。
基本上我有一个私有字段,我的构造函数调用了一个 'init/setup etc' 方法,该方法确实设置了私有字段,但它并不开心。
即
public class Test
{
private object bob;
public Test()
{
Init();
}
private void Init()
{
bob = new object();
}
}
编译器将构造函数突出显示为错误。我能以某种方式告诉它 Init()
做它想做的事吗?还是我遗漏了什么,这意味着 Init()
在某些情况下可能不会被调用,这会使警告有效?
我在最后的地方尝试了一些 !
,但似乎并非如此。如果我将代码从 Init()
移到构造函数中,这个简单示例和我的代码中的错误就会消失。
根据@Jeroen Mostert 的评论,解决方案是向子方法添加属性 MemberNotNull
,如下所示:
public class Test
{
private object bob;
public Test()
{
Init();
}
[MemberNotNull(nameof(bob))]
private void Init()
{
bob = new object();
}
}
请注意,C# 的未来版本可能不需要这样做。