0

编辑: 也许这是一个更清晰、更明确的问题表述:

在一些泛型接口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>();
    }
}

由于Implimplements IInterface<int>,对我来说我可以这样使用它似乎是合理的。然而,似乎我不能,我得到编译器错误

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

4

2 回答 2

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>();
于 2013-03-27T17:45:19.480 回答
1

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

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>();
    }
}

鉴于您的代码片段中的细节有限,这是否真的适合您的用例与您的附加方法定义是只有您才能知道的。

于 2013-03-27T17:45:30.480 回答