我有这个简单的代码:
public interface IReader<out T>
{
IEnumerable<T> GetData();
}这个接口在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>,不是吗?
谢谢。
发布于 2012-06-20 21:15:54
您应该能够通过向T添加class约束来解决您的问题。当涉及到结构时,协方差不起作用(IEnumerable<int>不能转换为IEnumerable<object>)。因为您没有将T约束为一个类,所以您可以传入一个IReader<some struct that implements IComposite>,它将是不可转换的。
发布于 2012-06-20 20:28:47
不幸的是没有。泛型不是协变的。IReader<T>和IReader<IComposite>是完全不相关的类型,尽管T与IComposite相关。
编辑:我不知道为什么这不适用于.Net 4和<out T>。还有没有人能回答?
发布于 2012-06-20 20:30:08
为什么不更改函数定义,因为这才是您真正想要的:
private static Func<bool> MakeSynchroFunc<T>(IReader<IComposite> reader) where T : IComposite您可能需要泛型参数T来做其他事情,所以我把它留在那里。
https://stackoverflow.com/questions/11119520
复制相似问题