我有这段简单的代码:
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>
:
注意:T必须实现IComposite接口。同步方法需要以IReader<IComposite>
作为输入:
private static bool Synchronize(IReader<IComposite> reader)
{
// ......
}
编译器告诉我无法将
IReader<T>
转换为IReader<IComposite>
,尽管有对T的限制和IReader的协变性。这里我做错了什么吗? 编译器应该能够验证约束条件,而协变性应该让我把
IReader<T>
用作IReader<Icomposite>
,不是吗?谢谢。
T
是一个结构体,那么它将违反协变性规则。您需要使用class
约束来满足编译器,以确保它是一个保持标识不变的转换。请参见:这是C#4中的协变性错误吗? - Ani