.NET协方差

dou*_*ret 9 .net c# covariance

我有这个简单的代码:

public interface IReader<out T>
{
    IEnumerable<T> GetData();
}
Run Code Online (Sandbox Code Playgroud)

这个接口应该在T上协变,我用这种方式:

private static Func<bool> MakeSynchroFunc<T>(IReader<T> reader) where T : IComposite
{
    return () => Synchronize(reader);
}
Run Code Online (Sandbox Code Playgroud)

注意T的约束来实现IComposite.同步方法接受IReader<IComposite>输入:

private static bool Synchronize(IReader<IComposite> reader)
{
    // ......
}
Run Code Online (Sandbox Code Playgroud)

编译器告诉我它无法转换IReader<T>IReader<IComposite>尽管T的约束和IReader的协方差.

我在这里做错了吗?编译器应该能够验证约束,协方差应该让我使用我IReader<T>IReader<Icomposite>,不是吗?

谢谢.

Gid*_*rth 5

您应该可以通过添加class约束来解决您的问题T.当涉及结构(IEnumerable<int>不可转换为IEnumerable<object>)时,协方差不起作用.由于你没有被限制T为一个类,你可以传入一个IReader<some struct that implements IComposite>不可转换的.