14

プロジェクトに共変インターフェイスを追加しました。

interface IView
{
}

interface IPresenter<out TView> where TView : IView
{
    TView View { get; }
}

これらのインターフェースを実装して、いくつかのクラスを作成しました。

class TestView : IView
{
}

class TestPresenter : IPresenter<TestView>
{
  public TestView View
  {
    get { return something; }
  }

  private void DoSomething()
  {
  }
}

そして、私はこれを問題なく使用できます:

IPresenter<IView> presenter = new TestPresenter();

したがって、すべてが正しいように見えるので、共分散の使用法が正しいと思います。残念ながら、私たちの単体テスト プロジェクトには、共変インターフェイスなど、同じプロジェクトにあるいくつかの型のプライベート アクセサーが含まれており、ビルド エラーが発生します。

型 'GenericInheritanceTest.IPresenter_Impl`1' をアセンブリ 'GenericInheritanceTest_Accessor、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null' から読み込めませんでした。これは、共変または反変型パラメーターを宣言しており、インターフェイスでもデリゲートでもないためです。

ここでの問題は正確には何ですか?私の実装に失敗はありますか?これを修正するには?共変型を使用するとすぐにアクセサーを回避する必要があるということはできませんか??? この問題を解決するために特定の型のアクセサを作成しないようにすることは可能ですか?

4

3 に答える 3

14

これはVisualStudio2010のバグです。MicrosoftConnectに報告されていますが、閉じられており、修正されないようです。

Bruce Taimanaによるブログエントリによると、プライベートアクセサ機能の開発は停止されており、VisualStudioの将来のバージョンで削除される可能性があります。リストされている可能な代替案は次のとおりです。

  1. このクラスを使用Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObjectして、コード内の内部APIとプライベートAPIへのアクセスを支援します。これはMicrosoft.VisualStudio.QualityTools.UnitTestFramework.dllアセンブリにあります。

  2. 内部APIまたはプライベートAPIにアクセスするためにコードを反映できるリフレクションフレームワークを作成します。

  3. アクセスしようとしているコードが内部である場合InternalsVisibleToAttribute、テストコードが内部APIにアクセスできるように、を使用してAPIにアクセスできる可能性があります。

于 2011-09-15T11:21:03.867 に答える
0

Unity Interception を使用していて、パラメーターが out としてラベル付けされている場合、Unity Interception はこのエラーを引き起こします。これは、Interception がパラメーター リストを読み取ることができる必要があるためです。したがって、上記のケースと同様に、Resharper がパラメーターが共変である可能性があると警告している場合、この警告は無視する必要があります。

于 2016-06-27T14:54:47.043 に答える