据我所知,集合初始化程序的使用取决于两件事:
据我所知System.Data.DataTable.Rows
满足这两个要求,因此我希望我能做到这一点:
DataRow row = _dt.Tables["TABLE"].NewRow();
_dt.Tables["TABLE"].Rows =
{
row
};
编译器抱怨:
也许你可以指出我的错误。
更新
我刚刚意识到我的问题是DataRowCollection
未实现IEnumerable
但 有Add()
方法。因此,我认为这不是纯粹因为IEnumerable
没有实现,所以我是正确的吗?如果是这样,为什么不能将其添加到BCL?
更新
请参阅此代码,该代码显示您可以使用初始化程序添加到现有集合中:
public class Person
{
public Person()
{
friends.Add("Paul");
}
List<string> friends = new List<string>();
public List<string> Friends
{
get { return friends; }
}
}
Person tom = new Person
{
//Adding to an existing collection NOT creating a new one
Friends = {"Steve", "Jim", "John"}
};
答案 0 :(得分:2)
Object and collection initializers仅在new
关键字引入的“对象创建表达式”中有效。来自C#4.0规范的§7.6.10.1:
对象创建表达式:
new
型(
参数列表<子>选择子>)
对象或 - 收藏 - 初始化<子>选择子>
new
型 对象或收集-初始化对象或收集-初始化:
对象的初始化
收集-初始化
来自§7.6.10.2:
对象初始值设定项由一系列成员初始值设定项组成,由
{
和}
标记括起,并以逗号分隔。在等号后面指定集合初始值设定项的成员初始值设定项是嵌入式集合的初始化。而不是将新集合分配给字段或属性,初始化程序中给出的元素将添加到字段或属性引用的集合中。
以下是创建新DataTable
的法律声明,并使用几个集合初始值设定项向嵌入式Columns
和Rows
集合中添加项目:
DataTable table =
new DataTable // <-- IMPORTANT
{
Columns = { { "Name", typeof(string) } }, // table.Columns.Add("Name", typeof(string));
Rows = { "John" }, // table.Rows.Add("John");
};
相反,以下陈述无效:
table.Rows = { "John" };
尽管表达式类似于集合初始值设定项,但它出现在对象创建表达式的上下文之外(任何地方都没有new
个关键字),因此编译器将语句解析为table.Rows = ...
而不是{{ 1}}。
在原始示例中,只需显式调用table.Rows.Add(...)
方法:
Add