При создании некоторых фиктивных данных для коллекции для проекта WPF/MVVM я создал следующий неверный код, который компилируется нормально, но во время выполнения выдает исключение.
Существует вложенная структура объектов данных, которые я ошибочно создаю только с помощью фигурных скобок (похоже, написание JavaScript наносит непоправимый вред мозгу).
using System.Collections.ObjectModel;
namespace testapp
{
class Program
{
static void Main(string[] args)
{
var collection = new ObservableCollection<TopLevelDataObject>();
collection.Add(new TopLevelDataObject{Nested = {Bar = 5}}); // NullReferenceException
}
class TopLevelDataObject
{
public NestedDataObject Nested { get; set; }
public string Foo { get; set; }
}
class NestedDataObject
{
public double Bar { get; set; }
}
}
}
Почему это компилируется?
Если я создаю анонимный тип, такой как Nested = new {Bar = 5}
, я получаю сообщение об ошибке во время компиляции (что, таким образом, терпит неудачу):
Cannot implicitly convert type '<anonymous type: int Bar>' to 'testapp.Program.NestedDataObject'
Почему я не получаю такой ошибки при пропуске оператора new
?
Он даже дает мне подсказку кода для свойства:
Я предполагаю, что {Bar = 5}
- это просто блок кода, который сам по себе является допустимым. Но почему допустимо присваивать кодовый блок чему угодно (в данном случае свойству Nested
)?