Combining List initializer and object initializer

☆樱花仙子☆ 提交于 2019-11-29 09:17:39

No, looking at the definitions from section 7.6.10 of the C# spec, an object-or-collection-initializer expression is either an object-initializer or a collection-initializer.

An object-initializer is composed of multiple member-initializers, each of which is of the form initializer = initializer-value whereas a collection-initializer is composed of multiple element-initializers, each of which is a non-assigment-expression.

So it looks like it's by design - possibly for the sake of simplicity. I can't say I've ever wanted to do this, to be honest. (I usually wouldn't derive from List<int> to start with - I'd compose it instead.) I would really hate to see:

var obj3 = new MyList { 1, 2, Text = "Hello", 3, 4 };

EDIT: If you really, really want to enable this, you could put this in the class:

class MyList : List<int>
{
    public string Text { get; set; }
    public MyList Values { get { return this; } }
}

at which point you could write:

var obj3 = new MyList { Text = "Hello", Values = { 1, 2, 3, 4 } };
jason

No, it's a not a bug. It is by design of the language.

When you write

var obj1 = new MyList() { Text="Hello" };

this is effectively translated by the compiler to

MyList temp = new MyList();
temp.Text = "Hello";
MyList obj = temp;

When you write

var obj2 = new MyList() { 1, 2, 3 };

this is effectively translated by the compiler to

MyList temp = new MyList();
temp.Add(1);
temp.Add(2);
temp.Add(3);
MyList obj2 = temp;

Note that in the first case you are using an object initializer, but in the second case you are using a collection initializer. There is no such thing as an object-and-collection intializer. You are either initializing the properties of your object, or you are initializing the collection. You can not do both, this is by design.

Also, you shouldn't derive from List<T>. See: Inheriting List<T> to implement collections a bad idea?

If you want to get something like this functionality, consider making a constructor argument:

var x = new CustomList("Hello World") { 1, 2, 3 }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!