C#类似实例的初始化语法

时间:2012-12-06 19:31:41

标签: c#

在C#中,我可以写

var y = new List<string>(2) { "x" , "y" };

获得List,其中“x”和“y”已初始化。

如何声明一个类来接受这种初始化语法?

我的意思是,我想写:

var y = new MyClass(2, 3) { "x" , "y" };

4 个答案:

答案 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();
    }
}