代码之家  ›  专栏  ›  技术社区  ›  Jonathan Wood

即使成员在构造函数中初始化,必需的关键字也会导致错误

  •  0
  • Jonathan Wood  · 技术社区  · 3 年前

    我有以下代码。创建 TestClass 实例失败,并显示错误。

    我预计第一个会失败,因为所需的属性没有初始化。然而,第二个调用的构造函数 做 初始化所需的属性。为什么那个失败了?

    什么是 属性构造函数 ?

    void Main()
    {
        TestClass test1 = new(); // <== Error CS9035 Required member 'TestClass.Name' must be set in the object initializer or attribute constructor
        TestClass test2 = new(""); // <== Error CS9035 Required member 'TestClass.Name' must be set in the object initializer or attribute constructor
    }
    
    class TestClass
    {
        public required string Name { get; set; }
        
        public TestClass()
        {
            
        }
        
        public TestClass(string name)
        {
            Name = name;
        }
    }
    
    2 回复  |  直到 3 年前
        1
  •  3
  •   Joe Sewell    3 年前

    我还没有太多地查看这个新功能,但它看起来只是“玩得很好” records 以及其他新构造,而不是普通类。

    基于 the docs ,只有类级别的主构造函数才会自动实现这一点;否则,您的构造函数必须 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 。喜欢:

    class TestClass
    {
        public required string Name { get; set; }
    
        public TestClass()
        {
    
        }
    
        [System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute]
        public TestClass(string name)
        {
            Name = name;
        }
    }
    

    我 想法 这是可行的,但它给出了相同的错误:

    record TestClass(string Name)
    {
        public required string Name { get; set; } = Name;
    }
    

    所以我想这只是部分答案。

        2
  •  1
  •   Moho    3 年前

    必需的修饰符表示它所应用的字段或属性必须由对象初始值设定项初始化。

    构造函数不是“对象初始值设定项”。对象初始化器是卷曲支撑的代码块,它可以选择性地跟随对象的实例化:

    var x = new TestClass { Name = "" };