2013-10-29 21 views
0

我正在寫在Visual Studio 2012的程序,並且我有兩個獨立的項目一對類:CodeContracts靜態檢查說,一個內部類其他程序集的成員是不可見的,儘管不夠用InternalVisibleTo

項目A:

namespace Test 
{ 
    internal class A 
    { 
    private A(B b) 
    { 
     Contract.Requires(b.X != null); 
    } 
    } 
} 

項目B:

namespace Test 
{ 
    internal class B 
    { 
    public string X; 
    } 
} 

在項目B AssemblyInfo.cs,我也有:

[assembly: InternalsVisibleTo("ProjectA")] 

這個編譯就好,直到我打開CodeContract靜態分析。在這一點上,我從ccrewrite中得到一個錯誤:Member 'Test.B.X' has less visibility than the enclosing method Test.A.#ctor(Test.B)

我認爲唯一可能導致問題的是CodeContracts不知道ProjectA可以看到ProjectB的內部,因此認爲類B的可見性基本上與這個上下文無關。雖然如果我將斷言改爲b != null,它似乎很好,所以也許這個論點並不成立。

任何人都可以證實這個斷言,或給我一個正確的解釋,並且缺少刪除Requires,關閉CodeContracts或更改B的可見性,是否有解決此錯誤的方法?

回答

1

代碼契約不知道屬性的含義:

[assembly: InternalsVisibleTo("ProjectA")] 

所以它不知道interals對了projectA可見。 InternalsVisibleToAttribute旨在簡化單元測試。

你應該思考爲什麼當他們需要了解彼此時,你會在不同的assamblies中分離兩個類。也許你可以用界面和某種工廠解決它。

+0

ProjectB是圍繞本機API的瘦C++/CLI包裝器,ProjectA是一些使用它的零碎件。這個想法是讓ProjectA能夠像使用ProjectB一樣使用ProjectB,然後將它們與ILMerge合併,形成一個單獨的程序集供其他項目使用。我不知道單元測試是InternalsVisibleTo屬性的最初目的。也許我會重新思考。 –

+0

另外,爲什麼CodeContracts允許需求'b!= null'?是什麼使'b.X!= null'這個法律不合法? –

+0

@PhilipC代碼合同斷言與需求是不同的檢查,斷言只是編譯到代碼中。需要在編譯時用於檢查。 – Peter

相關問題