codeconcontractions用于特定的通用接口

本文关键字:接口 用于 codeconcontractions | 更新日期: 2023-09-27 17:50:50

我想使用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<,>(不是isspecific),这个契约不起作用

codeconcontractions用于特定的通用接口

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

你应该得到一个类似

的错误
"... implements interface method ... thus cannot add Requires"

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

问候,罗纳德。