Несоответствие компиляции инициализатора словаря C#

Никогда не безопасно принять что-либо.

явная проверка также больше соглашается с тем, что Вы тестируете.

11
задан Ben M 23 September 2009 в 19:18
поделиться

2 ответа

Нет, это не ошибка ... это ошибка в вашем понимании синтаксиса инициализации :)

Идея

Dictionary = { ... }

предназначена для случаев, когда вызывающий имеет доступ для чтения к свойству коллекции, но не имеет доступа для записи . Другими словами, ситуации наподобие этой:

class Test
{
    private readonly Dictionary<string, string> dictionary 
        = new Dictionary<string, string>();
    public Dictionary<string, string> Dictionary { get { return dictionary; } }
}

В основном это заканчивается вызовом Add, но без предварительного создания новой коллекции. Итак, этот код:

Test test = new Test { Dictionary = { { "a", "b"}, {"c", "d" } };

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

Test tmp = new Test();
Dictionary<string, string> tmpDictionary = tmp.Dictionary;
tmpDictionary.Add("a", "b");
tmpDictionary.Add("c", "d");
Test test = tmp;

Хорошим примером того, где это полезно, является коллекция Controls для пользовательского интерфейса. Вы можете сделать это:

Form form = new Form
{
    Controls = 
    {
        new Button { Text = "Hi" }, 
        new TextBox { Text = "There" } 
    }
};

, но вы не могли установить свойство Controls , потому что оно '

32
ответ дан 3 December 2019 в 01:45
поделиться

Это не срабатывает с исключением нулевой ссылки, потому что вы объявили переменную ( Dictionary), который не инициализирован, следовательно, имеет значение NULL.

Когда вы пытаетесь добавить в него записи, используя синтаксис инициализатора, вы пытаетесь записать данные в нулевой объект.

Когда вы заменяете строку на " = new Dictionary ... ", вы создаете новый объект для словаря, который будет ссылаться на него, и, следовательно, можете успешно добавлять в него записи.

(В примере Джона Скита коллекция Controls должна быть уже создана Форма, следовательно, работает нормально)

1
ответ дан 3 December 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: