2015-06-11 2 views
5

У меня есть класс Item, который имеет общедоступный элемент NoSetter, который не содержит setter. Объект явно указывает get, который извлекает частный объект Listonly Listonly.Как встроенный список переопределяет свойство без setter?

class Item 
{ 
    private readonly List<string> emptyString; 

    public Item() 
    { 
     this.emptyString = new List<string>(); 
    } 

    public List<string> NoSetter 
    { 
     get { return this.emptyString; } 
    } 
} 

При создании этого объекта, вы не можете установить NoSetter в список, то компилятор не может каждый раз, когда вы пытаетесь.

List<string> goldenString = new List<string>(); 
goldenString.Add("Nope"); 
Item item = new Item() 
{ 
    NoSetter = goldenString 
    // or NoSetter = new List<string>(); 
}; 

Однако, если вы создаете список встроенных, вы можете установить NoSetter.

Item item = new Item() 
{ 
    NoSetter = { "But this still works" } 
}; 

// Outputs: "But this still works" 
Console.WriteLine(item.NoSetter.First<string>()); 

Я ожидаю, что метод NoSetter.Get должен быть возвращенным только для чтения списка emptyString, но вместо этого возвращает объект встраиваемого NoSetter. Что вызывает это в .net? Ожидается?

ответ

11

Ваш второй фрагмент кода не новый List<string>, он просто добавляет к нему эту ценность.

Item item = new Item() 
{ 
    NoSetter = { "But this still works" } 
}; 

эквивалентно:

Item item = new Item(); 
item.NoSetter.Add("But this still works"); 

The {...} синтаксис при применении к коллекции известен как Collection Initializer. Цитата из документации (выделено мной):

Инициализаторы коллекции позволяют указать один или несколько инициализаторов элементов при инициализации класса коллекции, который реализует IEnumerable. Инициализаторы элементов могут быть простым значением, выражением или инициализатором объекта. С помощью инициализатора коллекции вам не нужно указывать несколько вызовов метода Add в классе в вашем исходном коде; компилятор добавляет вызовы.

+2

Этот 'NoSetter = {" Но это все еще работает "}' не похоже на синтаксис 'Add', вы, вероятно, правы, но есть ли какая-либо ссылка на него? – Habib

+0

Я отчаянно ищу ...;) –

+0

Теперь это имеет смысл. Readonly emptyString не является неизменным, просто не назначается. – Joshua

Смежные вопросы