代码合同继承

时间:2012-02-16 10:07:08

标签: c# c#-4.0 code-contracts

发现代码合同有点奇怪,我想知道是否有人知道原因......

好的,所以一些代码示例的时间:

装配1:

[ContractClass(typeof(IServiceCodeContract<>))]
public interface IService<T> where T : class { ... }

[ContractClassFor(typeof(IService<>))]
public abstract class IServiceCodeContract<T> : IService<T> where T : class { ... }

public abstract class ServiceBase<T> : IService<T> where T : class { ... }

大会2:

[ContractClass(typeof(ICampaignServiceCodeContract))]
public class CampaignService : ServiceBase<Campaign>, ICampaignService { ... }

[ContractClassFor(typeof(ICampaignService))]
public abstract class ICampaignServiceCodeContract : IServiceCodeContract<Campaign>, ICampaignService { ... }

现在这是我的问题...... 在最后一行代码中,编译器很好,直到我实际编译代码然后突出显示“IServiceCodeContract&lt; Campaign&gt;”用蓝线表示找不到实际错误的类型:

The type or namespace name 'IServiceCodeContract' could not be found (are you missing a using directive or an assembly reference?)

我有一个从程序集2到程序集1的引用,我已经导入了“System.Diagnostics.Contracts”命名空间和缺少的类所在的命名空间。 该类被声明为public并显示在反射器内,所以为什么不能找到它呢?

程序集之间的代码契约继承是否存在某些问题?

编辑:

只是想一想,从另一个程序集继承一个契约基类会不会有问题...这个东西在编译时不会做一些疯狂的二进制注入事情吗?

也张贴在这里:http://forums.asp.net/t/1770324.aspx/1

1 个答案:

答案 0 :(得分:1)

派生类(ICampaignServiceCodeContract)的合约类不应该派生出除注释类之外的任何东西(在本例中为ICampaignService)。

您可以保留从基本接口/类继承的所有方法未实现(使用VS生成的默认主体),并仅在特定于此类/接口的方法中写入契约。

-MaF