Я создаю интерфейсный контракт, как описано в § 2.8. Интерфейсные контракты из 4 февраля 2011 г. Руководство пользователя кодовых контрактов (PDF) .Это не проблема.
Кроме того, я хочу смешать инвариант объекта (см. § 4.2 ContractInvariantMethod ) в том же интерфейсе контракта.Это проблема.Я не могу найти примеры использования объектных инвариантов в интерфейсных контрактах.
Я попытался добавить объектный инвариант к контракту интерфейса, как показано в следующем фрагменте кода.Это компилируется.Во время выполнения он не вызывает никаких ошибок, однако, по-видимому, он также не делает ничего положительного (т.е. вызывается).
/* Note: The intention of this snippet is to cause the data implementation
* to fail if it is not initalized before its public data access methods are called.
*/
[ContractClassFor(typeof(IDataProxy))]
abstract class IDataProxyContract : IDataProxy
{
[ContractInvariantMethod]
private void ObjectInvariant()
{
Contract.Invariant(IsInited == true, "Instance not initialized.");
}
Я не могу найти документацию, которая конкретно описывает этот сценарий или опровергает его.
На данный момент я не уверен, пропускаю ли я какой-либо шаг, чтобы заставить его работать, или если технология Code Contract полностью игнорирует объектный инвариант в этом контексте.Я хотел бы заставить это работать.Кто-нибудь знает ответ?