为什么会出现“类型参数必须始终有效……”错误?

| 我将尝试简化此代码示例:
public interface IThing
{
    //...  Stuff
}

public class Thing1 : IThing
{  
}

public class Thing2 : IThing
{  
}

public interface IThingView<out T>
{
    ICollection<T> ViewAll();
}

public class ThingView<T> : IThingView<T>
{
    ICollection<T> ViewAll() { return new List<T>(); }  //  There\'s a big operation here
}

public interface IThingViewerFactory
{
    public IThingView<IThing> Build(string Which);
}

public class ThingViewerFactory
{
    public IThingView<IThing> Build(string Which)
    {
        if(Which.Equals(\"Thing1\") { return new (IThingView<IThing>)new ThingViewer<Thing1>();}
        else { return new (IThingView<IThing>)new ThingViewer<Thing2>();}
    }
}
那是我在做什么的一个粗略想法。我有许多需要查看器的Thing类,它们将遵循一个公共接口。我想要一个工厂来生成这些文件,方法是传入一个带有名称的字符串。我一直在抱怨编译器错误: 无效的差异:类型参数\'T \'必须在\'IThingView.ViewAll()\'上始终有效。 \'T \'是协变的。 我意识到即使我能做到这一点,我之后也必须做一些转换……我很好。我意识到这种方法很有可能不是必需的。在这一点上,这已经成为一个更多的骄傲/好奇心问题。 谢谢!     
已邀请:
您无法制作协变
ICollection<T>
,因为它允许您将
T
放入其中。 您可以创建协变只读集合,逆变只写集合或不变读写集合。 您不能两者都做,否则就不是类型安全的。     
要扩展SLaks,请回答: 要编译代码,请将
ViewAll
的返回类型从
ICollection<T>
更改为
IEnumerable<T>
。     

要回复问题请先登录注册