c# - 协变对象初始值设定项?

标签 c# .net object-initializers

假设我有一个类,它的属性是一个字典,使用对象初始值设定项我可以使用这个语法(我认为它看起来很干净):

new MyClass()
{
  Table = { {"test",true},{"test",false} }
}

但是,在初始化器之外我不能这样做:

this.Table = { {"test",true},{"test",false} };

为什么初始化器是一个特例?我猜测它与 LINQ 要求、协方差或诸如此类的东西有关,但不能在任何地方使用这种初始化程序感觉有点不一致......

最佳答案

这个问题有点令人困惑,因为这个问题与 LINQ 无关,与泛型方差无关,并且具有集合初始值设定项和对象初始值设定项。真正的问题是,据我所知,“为什么在对象创建表达式之外使用集合初始值设定项是不合法的?

这里的相关设计原则是,一般来说,我们希望创建和初始化对象的操作在某处包含“new”一词,以向读者发出信号,表明此处正在创建对象。 (是的,在 C# 中这条规则有一些异常(exception)。作为读者的练习,看看你能不能把它们都说出来​​。)

按照自己的方式做事会增加推理代码的难度。快点,这是做什么的?

d = new List<int>() { 10, 20, 30 };
d = { 40, 50, 60 };

第二行是否将 40、50、60 附加到现有列表?还是用新列表替换旧列表?那里没有"new",那么读者是否期望创建了一个新对象?

当你说

q = new Whatever() { MyList = { 40, 50, 60 } };

这不会创建新列表;它将 40、50、60 附加到构造函数分配的现有列表中。因此,对于是否创建新列表,您提出的语法含糊不清且令人困惑。

提议的功能既令人困惑又不必要,因此不太可能很快实现。

关于c# - 协变对象初始值设定项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4773889/

相关文章:

c# - 我在使用 C# 对象初始值设定项时做错了什么?

c# - 我可以在对象构造之外使用对象初始值设定项吗?

c# - 使用 LINQ 填充具有单个列值的字符串

c# - OpenGL - 性能差且标度值高

c# - 使用 iTextSharp C# 更改 PDF 注释属性

c# - 基于类的GUI代码生成

C#:具有两个构造函数的对象:如何限制将哪些属性设置在一起?

c# - 从 ASMX 调用静态方法的陷阱

.net - 在自己的线程中运行连续进程的最佳方法是什么?

c# - 有没有办法在datagridview中获取新添加的行?