我有这个简单的代码:

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>,它是不可转换的。

10-07 14:27