为什么我会收到"The type parameter must be invariantly valid..."错误?



我将尝试缩短此代码示例:

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类需要一个查看器,它将遵循一个comon接口。我希望工厂通过我传递一个带有名称的字符串来生成这些。我不断收到一个编译器错误,抱怨:

无效差异:类型参数"T"在"IThingView"上必须是不变有效的。ViewAll()'.'T’是协变的。

我意识到,即使我能做到这一点,我也必须在之后做一些选角。。。我对此很满意。我意识到这种方法很可能没有必要。在这一点上,这更像是一个骄傲/好奇的问题。

谢谢!

您不能生成协变ICollection<T>,因为它允许您将Ts放入其中。

您可以创建协变只读集合、反变只读集合或不变读写集合
你不能两者都做,否则就不安全。

要扩展SLaks答案:
要编译代码,请将ViewAll的返回类型从ICollection<T>更改为IEnumerable<T>

相关内容

  • 没有找到相关文章

最新更新