代码之家  ›  专栏  ›  技术社区  ›  Jeremy

初始化集合和集合的属性[重复]

c#
  •  0
  • Jeremy  · 技术社区  · 6 年前

    是否可以同时组合列表初始值设定项和对象初始值设定项? 给定以下类定义:

    class MyList : List<int>
    {
        public string Text { get; set; }
    }
    
    // we can do this
    var obj1 = new MyList() { Text="Hello" };
    
    // we can also do that
    var obj2 = new MyList() { 1, 2, 3 };
    
    // but this one doesn't compile
    //var obj3 = new MyList() { Text="Hello", 1, 2, 3 };
    

    这是设计的,还是只是c编译器的一个bug或缺少的特性?

    0 回复  |  直到 13 年前
        1
  •  28
  •   Jon Skeet    13 年前

    不,看看C规范第7.6.10节的定义 object-or-collection-initializer 表达式是 任何一个 object-initializer collection-initializer .

    对象初始值设定项 由多个 member-initializer s、 每一个都是 initializer = initializer-value 鉴于 由多个 element-initializer non-assigment-expression .

    所以它看起来像是设计的-可能是为了简单。我不能说我曾经 通缉犯 List<int> 首先-我会写下来。)我真的不想看到:

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

    真的,真的

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

    var obj3 = new MyList { Text = "Hello", Values = { 1, 2, 3, 4 } };
    
        2
  •  3
  •   Community CDub    7 年前

    不,不是虫子。它是由语言设计的。

    当你写作的时候

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

    编译器可以有效地将其转换为

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

    当你写作的时候

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

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

    请注意,在第一种情况下,您使用的是对象初始值设定项,但在第二种情况下,您使用的是集合初始值设定项。没有对象和集合初始化器这样的东西。您正在初始化对象的属性,或者正在初始化集合。你不能两者兼得,这是故意的。

    而且,你不应该从 List<T> . 请参见: Inheriting List<T> to implement collections a bad idea?

        3
  •  2
  •   Tejs    13 年前

    如果希望获得类似于此功能的内容,请考虑使用构造函数参数:

    var x = new CustomList("Hello World") { 1, 2, 3 }