修改 也许这是一个更清晰的问题,更多的是问题的重点:
在一些通用接口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>>
答案 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>();
}
}
考虑到代码段中细节的限制,这是否真的适合您的用例以及其他方法定义,这是您可以知道的。