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