我正在寫在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
的可見性,是否有解決此錯誤的方法?
ProjectB是圍繞本機API的瘦C++/CLI包裝器,ProjectA是一些使用它的零碎件。這個想法是讓ProjectA能夠像使用ProjectB一樣使用ProjectB,然後將它們與ILMerge合併,形成一個單獨的程序集供其他項目使用。我不知道單元測試是InternalsVisibleTo屬性的最初目的。也許我會重新思考。 –
另外,爲什麼CodeContracts允許需求'b!= null'?是什麼使'b.X!= null'這個法律不合法? –
@PhilipC代碼合同斷言與需求是不同的檢查,斷言只是編譯到代碼中。需要在編譯時用於檢查。 – Peter