泛型和接口问题

Kyl*_*yle 3 c# generics implementation interface

给出以下类和接口:

public class Test<T>
{
}

public interface ITesting<T>
{
    Test<T> LoadTest();
}
Run Code Online (Sandbox Code Playgroud)

我可以添加一个具有以下内容的类:

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

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

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,并没有错误.如果我尝试用以下内容替换该类:

public class TestDerived : Test<object>
{
}

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

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

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

我现在收到以下错误:

Error   'TestDerivedManager' does not implement interface member 'ITesting.LoadTest()'. 'TestDerivedManager.LoadTest()' cannot implement 'ITesting.LoadTest()' because it does not have the matching return type of 'Test'.

但对我来说,好像这应该工作为TestDerivedTest<object>.我显然在这里没有正确理解.有人可能会指出我为何不正确的细节吗?也许我可能会做些什么来纠正它?

Dan*_*rth 6

一个TestDerivedTest<object>,是的,但是Test<object>不是一个TestDerived.

合同说ITesting<object>有一种方法可以退货Test<object>.不只是一个特例(TestDerived).

要使代码正常工作,请按以下方式进行更改:

public class TestDerivedManager : ITesting<object>
{
    public Test<object> LoadTest()
    {
        return new TestDerived();
    }
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 6

您想要的功能称为返回类型协方差.它是c ++的一个特性,但不是c#的特性,所以你必须做错误所说的.

我建议你做一个调用你的公共方法的显式接口实现.这样你就可以获得两全其美.