0

我想使用 CodeContracts 来验证通用接口的一些特定实现。我有一个基本的通用接口

 public interface IEnityMap<in TSource,out TDest>
 {
  TDest Map(TSource);
 }

我想确定一些特定接口的 CodeContracts。我试图做这样的事情:

[ContractClass(typeof(ContractClass))]
public interface ISpecific: IEntityMap<SourceClass,DestClass>{}

[ContractClassFor(typeof(ISpecific))]
public abstract class ContractClass: ISpecific
{
public DestClass Map(SourceClass source)
{
  Contract.Requires(source.SomeProperty!= null);
  //Other checks
  return default(DestClass);
}
}

我的 Mapping 类实现了通用接口 - IEntityMap<,> (不是 ISpecific),这个合同不起作用。

4

1 回答 1

0

正如我从您的代码示例中了解到的那样,您派生了一个更专业的接口,其中您有比通用接口更多的约束。根据文档(以及基础的 Liskov 替代原则),根本不允许在子类或更专业的接口中具有更多约束。

你应该得到一个错误

"... implements interface method ... thus cannot add Requires"

可以做的是尝试将类型转换为您的特定类型,然后在派生(抽象)基类中声明您的特定实现。但是,根据传递的值具有不同行为的接口可能容易出错并导致意外的运行时错误。

问候,罗纳德

于 2017-03-06T11:37:55.020 回答