c# – 协变对象初始化器?
发布时间:2020-12-15 17:39:37 所属栏目:百科 来源:网络整理
导读:假设我有一个具有字典 string,bool属性的类,使用对象初始化程序我可以使用这种语法(我觉得看起来很干净): new MyClass(){ Table = { {"test",true},{"test",false} }} 但是,在初始化程序之外我不能这样做: this.Table = { {"test",false} }; 为什么初始化
假设我有一个具有字典< string,bool>属性的类,使用对象初始化程序我可以使用这种语法(我觉得看起来很干净):
new MyClass() { Table = { {"test",true},{"test",false} } } 但是,在初始化程序之外我不能这样做: this.Table = { {"test",false} }; 为什么初始化器是特例?我猜测它与LINQ要求,协方差或诸如此类的东西有关,但感觉有点不一致,无法在任何地方使用这种初始化器… 解决方法
这个问题有些令人困惑,因为这个问题与LINQ无关,与泛型方差无关,并且具有集合初始值设定项以及对象初始值设定项.真正的问题是,据我所知,“为什么在对象创建表达式之外使用集合初始化程序是不合法的?”
这里的相关设计原则是,一般来说,我们希望创建和初始化对象的操作在其中包含“new”一词,作为向读者发出的信号,即此处发生了对象创建. (是的,C#中的这条规则有一些例外.作为读者的练习,看看你是否可以将它们全部命名.) 按照自己的方式做事会使代码更难理解.快,这是做什么的? d = new List<int>() { 10,20,30 }; d = { 40,50,60 }; 第二行是否将40,60附加到现有列表中?或者用新的列表替换旧列表?那里没有“新”,那么读者是否期望创建一个新对象? 当你说 q = new Whatever() { MyList = { 40,60 } }; 这不会创建新列表;它将40,60附加到构造函数分配的现有列表中.因此,您建议的语法是否含糊不清,并且是否创建了新列表. 建议的功能既令人困惑又不必要,因此不太可能很快实施. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |