Я некоторое время использую С#, но недавно заметил, что поведение одного из моих модульных тестов изменилось в зависимости от того, какая вариация выражения инициализации коллекции я использовал:
-
var object = new Class { SomeCollection = new List<int> { 1, 2, 3 } };
-
var object = new Class { SomeCollection = { 1, 2, 3 } };
До этого момента я предполагал, что вторая форма была просто синтаксическим сахаром и была семантически эквивалентна первой форме. Однако переход между этими двумя формами привел к провалу unit test.
Пример кода ниже демонстрирует это:
void Main()
{
var foo1 = new Foo { Items = new List<int> { 1, 2, 3} };
var foo2 = new Foo { Items = { 1, 2, 3 } };
foo1.Dump();
foo2.Dump();
}
class Foo
{
public List<int> Items { get; set; }
}
Когда я запускаю это, первое назначение работает отлично, а второе - в NullReferenceException
.
Чувство моего чувства заключается в том, что за кулисами компилятор обрабатывает эти два выражения следующим образом:
var foo1 = new Foo();
foo1.Items = new List<int> { 1, 2, 3 };
var foo2 = new Foo();
foo2.Items.Add(1);
foo2.Items.Add(2);
foo2.Items.Add(3);
Насколько это предположение верно?