回报类型的差异

时间:2013-03-27 08:33:46

标签: c# variance

修改 也许这是一个更清晰的问题,更多的是问题的重点:

在一些通用接口IInterface<T>中,我想返回一个泛型类型的对象,其中一个类型参数应该是IInterface<T>的实现。

public class OtherType<T> {}
public interface IInterface<T>
{
    OtherType<IInterface<T>> Operation();
}
public class Impl : IInterface<int>
{
    public OtherType<IInterface<int>> Operation()
    {
        return new OtherType<Impl>();
    }
}

由于Impl实现IInterface<int>,因此我可以这样使用它似乎是合理的。然而,似乎我不能,我得到编译器错误

  

无法将表达式类型OtherType<Impl>转换为返回类型OtherType<IInterface<int>>

2 个答案:

答案 0 :(得分:1)

OtherType<IInterface<int>>并不意味着“实现” - 它的意思是“是一个带有泛型类型参数OtherType的类型Interface<int>,但这不是你怎么说的。

如果您只是想确保返回类型实现IInterface<int>,那么将其设置为返回类型:

public interface IInterface<T>
{
    IInterface<T> Operation();
}

public class Impl : IInterface<int>
{
    public <IInterface<int>> Operation()
    {
        return new OtherType();
    }
}

,其中

public class OtherType : IInterface<int>
{}

这意味着您可以返回任何实现IInterface<int>的类型。

否则,您可以在调用使用泛型类型约束时更加限制:

public interface IInterface<T>
{
    TRet Operation<TRet>() where TRet : IInterface<T>;
}

public class Impl : IInterface<int>
{
    public TRet Operation<TRet>() where TRet : IInterface<int>
    {
        return new OtherType();
    }
}

这意味着您可以约束操作以返回特定的类,而这又反过来实现IInterface<int>

它将被称为:

Impl i = new Impl();
OtherType x = i.Operation<OtherType>();

答案 1 :(得分:1)

问题是OtherType<T>是一个类,泛型类不允许C#中的共同/逆转。通用interfaces只要out类型没有出现在任何输入位置,in类型就不会出现在任何输出位置。在您的代码示例中,您可以通过引入标记为covariant的附加接口,然后更改返回类型来使其编译。

public interface IOtherType<out T> {} // new
public class OtherType<T> : IOtherType<T> { }

public interface IInterface<T>
{
    IOtherType<IInterface<T>> Operation(); // altered
}
public class Impl : IInterface<int>
{
    public IOtherType<IInterface<int>> Operation()
    {
        return new OtherType<Impl>();
    }
}

考虑到代码段中细节的限制,这是否真的适合您的用例以及其他方法定义,这是您可以知道的。