Ну, я полагаю, кодовые контракты могли бы вставить дополнительный вызов инварианта в конце инициализатора объекта - если бы он мог сказать, что это используется. (Не забывайте, что он в основном использует IL, а не исходный код; насколько я знаю, исходный код используется только для генерации сообщений об ошибках.)
Это кажется мне плохим дизайном - обнадеживает неудачная природа инициализаторов объектов. Что бы вы сделали с настройкой свойств после инициализатора объекта? Они могут снова сделать объект недействительным.
Звучит так, будто вы хотите, чтобы по крайней мере некоторые свойства были неизменяемыми, но вы хотите воспользоваться простотой инициализаторов объектов. Именованные аргументы и необязательные параметры в C # 4 дают вам кое-что из этого - создайте конструктор со всеми соответствующими свойствами (и значениями по умолчанию), затем вы можете вызвать его так:
Person person = new Person(firstName: "Jon", lastName: "Skeet");
Это не далеко от синтаксиса инициализатора объекта:
Person person = new Person { FirstName = "Jon", LastName = "Skeet" };
Это не идеально, и я бы хотел, чтобы в C # была больше поддержки неизменяемых типов (как создание, так и использование), но это начало ...