在C#中,我可以写
var y = new List<string>(2) { "x" , "y" };
获得List
,其中“x”和“y”已初始化。
如何声明一个类来接受这种初始化语法?
我的意思是,我想写:
var y = new MyClass(2, 3) { "x" , "y" };
答案 0 :(得分:6)
请参阅C#规范的第7.6.10.3节:
应用集合初始值设定项的集合对象 必须是实现System.Collections.IEnumerable或a的类型 发生编译时错误。对于每个指定的元素按顺序, collection initializer用目标对象调用Add方法 元素初始值设定项的表达式列表作为参数列表, 为每次调用应用正常的重载决策。就这样 集合对象必须包含适用于每个的Add方法 元素初始化器。
一个非常简单的例子:
class AddIt : IEnumerable
{
public void Add(String foo) { Console.WriteLine(foo); }
public IEnumerator GetEnumerator()
{
return null; // in reality something else
}
}
class Program
{
static void Main(string[] args)
{
var a = new AddIt() { "hello", "world" };
Console.Read();
}
}
这将打印“hello”,然后将“world”打印到控制台。
答案 1 :(得分:1)
我不确定(2,3)应该表明什么。我知道这是你的收藏规模在第一行。您可以简单地从List或您需要模仿的任何结构继承。
刚刚在LinqPad中测试了这个样本:
void Main()
{
var list = new Foo{
"a",
"b"
};
list.Dump();
}
class Foo : List<string>{ }
答案 2 :(得分:0)
只需使用以下语法初始化类的字段:
// ...
Car myCar1 = new Car () { Model = "Honda", YearBuilt=2009 };
Car myCar2 = new Car () { Model = "Toyota", YearBuilt=2011 };
// ...
public class Car {
public string Model;
public int YearBuilt;
}
答案 3 :(得分:0)
正如Marcus所指出的,该类必须实现IEnumerable
接口,并且调用者可以使用Add()
方法。
简而言之,这个骨架示例将起作用:
public class MyClass : IEnumerable
{
public void Add(string item)
{
}
public IEnumerator GetEnumerator()
{
throw new NotImplementedException();
}
}