我有这个简单的代码:
public interface IReader<out T>
{
IEnumerable<T> GetData();
}
这个接口(interface)应该在T上是协变的,我以这种方式使用它:
private static Func<bool> MakeSynchroFunc<T>(IReader<T> reader) where T : IComposite
{
return () => Synchronize(reader);
}
请注意T实现IComposite的约束。
同步方法在输入中采用
IReader<IComposite>
:private static bool Synchronize(IReader<IComposite> reader)
{
// ......
}
编译器告诉我,尽管存在T约束和IReader的协方差,但它无法从
IReader<T>
转换为IReader<IComposite>
。我在这里做错什么了吗?
编译器应该能够验证约束,并且协方差应该让我将
IReader<T>
用作IReader<Icomposite>
,不是吗?谢谢。
最佳答案
您应该能够通过向class
添加T
约束来解决您的问题。当涉及到结构时,协方差不起作用(IEnumerable<int>
无法转换为IEnumerable<object>
)。由于您没有将T
约束为一个类,因此可以传入IReader<some struct that implements IComposite>
,它是不可转换的。