Ну, я полагаю, что кодовые контракты могут вставить дополнительный вызов инварианту в конце инициализатора объекта - если бы он мог сказать, что это использовалось. (Не забывайте, что в основном использует IL, а не исходный код, насколько мне известно, исходный код используется только для генерации сообщений об ошибках.)
Это поражает меня как плохой дизайн, хотя по несчастливой природе инициализаторов объектов. Что бы вы сделали с настройкой свойств после инициализатора объекта? Они могут снова сделать объект недействительным.
Похоже, вы в основном хотите, чтобы хотя бы некоторые свойства были неизменными, но вы хотите получить выгоду от простоты инициализаторов объектов. Именованные аргументы и необязательные параметры в C# 4 дать вам некоторые из этого - создать конструктор со всеми соответствующими свойствами (и значения по умолчанию), то вы можете назвать это так:
Person person = new Person(firstName: "Jon", lastName: "Skeet");
Это не далеко от объекта инициализатора синтаксис:
Person person = new Person { FirstName = "Jon", LastName = "Skeet" };
это не идеально, и я хочу, C# было больше поддержки неизменных типов (как создание и использование), но это только начало ...
это тот же вопрос, как HTTP://stackoverflow.com/questions/2656548/ioc-container-handling-state-params-in-non-default-constructor? Если да, то это намного яснее и точнее, но если это не так, возможно, вам стоит подчеркнуть, что в этом отличается ... –