как тема темы, я столкнулся с ужасными предупреждениями / ошибками с контрактами кода и интерфейсом.Вот мой сценарий
Первичный интерфейс
[ContractClass(typeof(DTOInfoContract))]
public interface IDTOInfo
{
int ID { get; }
string Description { get; }
string LinkText { get; }
string Title { get; }
void DTOInit(int id, string title, string descr, string linkText);
}
Вторичные интерфейсы
[ContractClass(typeof(DTONewsContract))]
public interface IDTONews : IDTOInfo
{
}
[ContractClass(typeof(DTOPromoContract))]
public interface IDTOPromo : IDTOInfo
{
string Photo { get; }
void DTOPromoInit(int id, string title, string descr, string linkText, string Photo);
А затем мои контракты
[ContractClassFor(typeof(IDTOInfo))]
public abstract class DTOInfoContract : IDTOInfo
{
int IDTOInfo.ID
{
get { Contract.Ensures(Contract.Result<int>() > 0, "Returned value is out of Range"); return default(int); }
}
string IDTOInfo.Description
{
get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
}
string IDTOInfo.LinkText
{
get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
}
string IDTOInfo.Title
{
get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
}
void IDTOInfo.DTOInit(int id, string title, string descr, string linkText)
{
Contract.Requires<ArgumentOutOfRangeException>(id > 0, "id has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(title), "titolo has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(descr), "descr has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(linkText), "linkText has no valid value");
}
}
}
[ContractClassFor(typeof(IDTONews))]
public abstract class DTONewsContract : IDTONews
{
int IDTOInfo.ID
{
get { Contract.Ensures(Contract.Result<int>() > 0, "Returned value is out of Range"); return default(int); }
}
string IDTOInfo.Description
{
get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
}
string IDTOInfo.linkText
{
get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
}
string IDTOInfo.Title
{
get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
}
void IDTOInfo.DTOInit(int id, string title, string descr, string linkText)
{
Contract.Requires<ArgumentOutOfRangeException>(id > 0, "id has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(title), "title has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(descr), "descr has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(linkText), "linkText has no valid value");
}
}
[ContractClassFor(typeof(IDTOPromo))]
public abstract class DTOPromoContract : IDTOPromo
{
string IDTOPromo.Photo
{
get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
}
void IDTOPromo.DTOPromoInit(int id, string title, string descr, string linkText, string photo)
{
Contract.Requires<ArgumentOutOfRangeException>(id > 0, "id has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(title), "title has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(descr), "descr has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(linkText), "linkText has no valid value");
}
int IDTOInfo.ID
{
get { Contract.Ensures(Contract.Result<int>() > 0, "Returned value is out of Range"); return default(int); }
}
string IDTOInfo.Description
{
get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
}
string IDTOInfo.LinkText
{
get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
}
string IDTOInfo.Title
{
get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
}
void IDTOInfo.DTOInit(int id, string title, string descr, string linkText)
{
Contract.Requires<ArgumentOutOfRangeException>(id > 0, "id has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(title), "title has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(descr), "descr has no valid value");
Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(linkText), "linkText has no valid value");
}
}
В этой ситуации ятолько некоторые предупреждения, такие как следующее
warning CC1076: Contract class DTOPromoContract cannot define contract for method IDTOInfo.get_ID as its original definition is not in type IDTOPromo. Define the contract on type IDTOInfo instead.
Но, если я попытаюсь удалить метод и свойства IDTOInfo в классах контрактов IDTONews и IDTOPromo, ошибки будут, например, следующие
Error 40 'DTOPromoContract' does not implement the member of interface 'IDTOInfo.Description'
Странная ситуация, не правда ли?Есть ли решение, позволяющее наилучшим образом сочетать кодовые контракты и интерфейс с предыдущим сценарием?
Спасибо!