3

次のクラスとインターフェースがあるとします。

public class Test<T>
{
}

public interface ITesting<T>
{
    Test<T> LoadTest();
}

次のクラスを追加できます。

public class TestManager : ITesting<object>
{
    #region ITesting

    public Test<object> LoadTest()
    {
        return new Test<object>();
    }

    #endregion
}

これは正常に機能し、エラーはスローされません。そのクラスを次のものに置き換えようとすると:

public class TestDerived : Test<object>
{
}

public class TestDerivedManager : ITesting<object>
{
    #region ITesting

    public TestDerived LoadTest()
    {
        return new TestDerived();
    }

    #endregion
}

次のエラーが表示されます。

エラー 'TestDerivedManager' はインターフェイス メンバー 'ITesting.LoadTest()' を実装していません。'TestDerivedManager.LoadTest()' は 'ITesting.LoadTest()' を実装できません。一致する戻り値の型 'Test' がないからです。

しかし、私にはこれがそのまま機能するように思えTestDerivedますTest<object>。私は明らかにここで何かを正しく理解していません。なぜこれが間違っているのか、誰かが私に詳細を教えてもらえますか? そして、おそらくそれを修正するために私は何ができるでしょうか?

4

5 に答える 5

6

必要な機能は、戻り型の共分散と呼ばれます。これは c++ の機能ですが、c# の機能ではないため、エラーの内容を実行する必要があります。

パブリック メソッドを呼び出す明示的なインターフェイスの実装を作成することをお勧めします。そうすれば、両方の長所を活かすことができます。

于 2013-05-13T14:13:24.820 に答える
4

メソッドの戻り値の型を元に戻すとTest<object>、機能するはずです。戻り値の型は、インターフェイスを実装する際のコントラクトの一部です。TestDerivedですので返品も可能Test<object>です。

于 2013-05-13T13:41:28.023 に答える