了解为什么我仍然在构造函数中遇到 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# 的未来版本可能不需要这样做。