2012-02-16 71 views
0

搜了一下,代碼合同的古怪的,我想知道是否有人知道原因......代碼合同繼承

確定,所以時間對於一些代碼示例:

大會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 <運動>」用藍線說,它無法找到實際的錯誤讀取類型:

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

+0

這種問題很容易用ReSharper解決。您可以在http://www.jetbrains.com/resharper/download下載試用版。祝你好運! – 2012-02-16 10:28:55

+0

嗯......現在就下載吧。 – War 2012-02-16 10:36:23

+1

這是如何幫助我解決問題的?你能提供一些細節嗎? – War 2012-02-16 10:58:40

回答

1

派生類(ICampaignServiceCodeContract)你的合同類不應該從什麼,但它是註釋(在這種情況下ICampaignService)的類派生。

您可以保留所有從基本接口/類繼承的方法(使用由VS生成的默認主體),並僅在特定於此類/接口的方法中寫入契約。

-MaF

+0

我通過微軟發送了代碼合同的人,經過一些複雜的解釋之後,我發現這是問題......這很有趣請注意,代碼合約目前並不適用於(按照繼承條款)框架其他部分的工作方式... contract:contractBase,Icontract ...在正常的.net空間中完全有效,但不在代碼合同中。完整的細節可以在http://social.msdn.microsoft找到。com/Forums/zh-CN/codecontracts/thread/9cf0acd9-add0-41d3-8e77-20928ddb000d – War 2012-02-17 16:56:27

+0

@Wardy您可能有興趣知道MaF實際上是代碼合同夥伴之一 – Lukazoid 2013-04-24 20:43:33