C# 不可变类型构造函数速记

C# 不可变类型构造函数速记,c#,C#,我在C#中有一些不可变的类型。他们基本上都只是 public class Class : IInterface { public Class(IInterface2 prop1, IInterface2 prop2) { Property1 = prop1; Property2 = prop2; } public IInterface2 Property1 { get; } public IInterface2 Prope

我在C#中有一些不可变的类型。他们基本上都只是

public class Class : IInterface
{
    public Class(IInterface2 prop1, IInterface2 prop2)
    {
        Property1 = prop1;
        Property2 = prop2;
    }

    public IInterface2 Property1 { get; }
    public IInterface2 Property2 { get; }
}
我刚刚发现了一个bug,其中构造函数中的两个属性集混淆了

在C#中是否有可以省略或生成此构造函数的不可变类型的缩写

我试过了

public class Class : IInterface
{
    public readonly IInterface2 Property1;
    public readonly IInterface2 Property2;
}
不幸的是,当我尝试使用它时,例如

var f = new Class { Property1 = null, Property2 = null };

编译器对我大喊大叫,说只读字段只能在构造函数或变量初始值设定项中设置,尽管它显然是一个该死的变量初始值设定项。

不,C#中没有语法允许从类外部设置只读属性或自动生成构造函数

初始值设定项语法只是属性集调用的语法糖——所以这是预期的行为,而不是规范中的疏忽。这一点将在MSDN文章中讨论:

对象初始值设定项允许您在创建时将值分配给对象的任何可访问字段或属性,而无需调用紧跟着赋值语句行的构造函数


不,C#中没有允许从类或自动生成构造函数外部设置只读属性的语法

初始值设定项语法只是属性集调用的语法糖——所以这是预期的行为,而不是规范中的疏忽。这一点将在MSDN文章中讨论:

对象初始值设定项允许您在创建时将值分配给对象的任何可访问字段或属性,而无需调用紧跟着赋值语句行的构造函数

“只能在构造函数或变量中设置只读字段 初始化器,尽管它显然是一个该死的变量 初始值设定项。”

不,不是。“变量初始值设定项”是指:

=5
”是变量初始值设定项,因为您在定义的同一位置初始化变量

您所称的“变量初始值设定项”实际上是“对象初始值设定项”,它只是以下方面的语法糖:

  • 调用构造函数
  • 在构造函数外部设置属性列表
  • 例如:

    var c = new Class("hello", 4.5) //<-- this is the constructor
    {
        Prop1 = new DataTable(),  //<-- from here you're outside the constructor,
        Prop2 = new Point(2,3),   //    so you can't set an only "{ get; }" property.
        Prop3 = 0.2,
    };
    
    var c=新类(“hello”,4.5)//
    “只能在构造函数或变量中设置只读字段
    初始化器,尽管它显然是一个该死的变量
    初始值设定项。”

    不,不是。“变量初始值设定项”是指:

    =5
    ”是变量初始值设定项,因为您在定义的同一位置初始化变量

    您所称的“变量初始值设定项”实际上是“对象初始值设定项”,它只是以下方面的语法糖:

  • 调用构造函数
  • 在构造函数外部设置属性列表
  • 例如:

    var c = new Class("hello", 4.5) //<-- this is the constructor
    {
        Prop1 = new DataTable(),  //<-- from here you're outside the constructor,
        Prop2 = new Point(2,3),   //    so you can't set an only "{ get; }" property.
        Prop3 = 0.2,
    };
    

    var c=new Class(“hello”,4.5)/如果我理解正确,您希望能够初始化只读字段的原因是为了避免在错误顺序调用具有两种兼容类型的构造函数时发生混淆,对吗

    因此,虽然其他问题很好地解释了为什么这目前不可能,但有一种有用的技术可以用来最小化这个问题,同时仍然使用相同的构造函数-。C#允许您显式声明参数的名称,然后按任意顺序指定它们:

    var myClass = new Class(prop2: interface2Instance, prop1: interface1Instance);
    
    这将被编译,并且在传递给哪个参数的值中是显式的


    当然,您不能在代码本身中强制执行此要求,但如果您发现有许多具有兼容类型的构造函数需要澄清,它可以成为您的编码风格指南的一部分。

    如果我理解正确,您希望能够初始化只读字段的原因是为了避免以错误的顺序调用具有两种兼容类型的构造函数时出现混淆,对吗

    因此,虽然其他问题很好地解释了为什么这目前不可能,但有一种有用的技术可以用来最小化这个问题,同时仍然使用相同的构造函数-。C#允许您显式声明参数的名称,然后按任意顺序指定它们:

    var myClass = new Class(prop2: interface2Instance, prop1: interface1Instance);
    
    这将被编译,并且在传递给哪个参数的值中是显式的


    当然,您不能在代码本身中强制执行此要求,但如果您发现有许多具有兼容类型的构造函数需要澄清,则它可以成为您的编码风格指南的一部分。

    您是说.NET上的编译器中存在错误吗?嗯,我想这是规范中的一个疏忽,你不能这样设置只读字段。你有编译错误吗?您使用的是C#6还是更早的版本?我使用的是VS2015 Update 2,它是最新的可用版本。我指的是构造函数中的两个属性集混淆的
    错误。这是你代码中的错误吗?或者你怀疑.NET中有漏洞吗?你是说.NET中的编译器有漏洞吗?嗯,我想这是规范中的一个疏忽,你不能这样设置只读字段。你有编译错误吗?您使用的是C#6还是更早的版本?我使用的是VS2015 Update 2,它是最新的可用版本。我指的是构造函数中的两个属性集混淆的
    错误。这是你代码中的错误吗?或者您怀疑.NET中有bug吗?看来他们需要修复初始化器语法才能真正初始化。这里的关键部分是“在创建时”。@Puppy试图为您想要的功能提供合适的规范,这总是一个很好的练习。如果您决定试用它,请不要忘记属性不是字段-因此需要想出一种方法,在允许初始值设定语法的同时,不能从对象外部使用
    设置
    属性。似乎他们需要修复初始值设定语法来实现初始化,然后。关键是他