0

私は Visual Studio 2012 でプログラムを書いており、2 つの別々のプロジェクトに 1 組のクラスがあります。

プロジェクトA:

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

プロジェクトB:

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

AssemblyInfo.csProjectB には、次のものもあります。

[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ますBか?

4

1 に答える 1

1

コード コントラクトは属性の意味を認識していません。

[assembly: InternalsVisibleTo("ProjectA")]

したがって、interals が projectA に表示されることはわかりません。InternalsVisibleToAttribute は、単体テストを容易にするように設計されています。

2 つのクラスがお互いを知る必要があるときに、なぜ 2 つのクラスを異なるアセンブリに分離するのかを考える必要があります。おそらく、インターフェースとある種のファクトリーで解決できるでしょう。

于 2013-10-29T14:50:51.437 に答える