为什么我得到“类型参数必须是无效的……”错误?

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

public interface IThing { //... Stuff } public class Thing1 : IThing { } public class Thing2 : IThing { } public interface IThingView { ICollection ViewAll(); } public class ThingView : IThingView { ICollection ViewAll() { return new List(); } // There's a big operation here } public interface IThingViewerFactory { public IThingView Build(string Which); } public class ThingViewerFactory { public IThingView Build(string Which) { if(Which.Equals("Thing1") { return new (IThingView)new ThingViewer();} else { return new (IThingView)new ThingViewer();} } } 

这是我正在做的事情的粗略概念。 我有许多Thing类需要一个查看器,它将遵循一个comon接口。 我希望一个工厂通过我传递一个带有名字的字符串来生成这些。 我不断抱怨编译错误:

方差无效:类型参数“T”必须在“IThingView.ViewAll()”上无效。 ‘T’是协变的。

我意识到,即使我让这个工作,我也必须做一些演员……我很好。 我意识到这种方法很可能没有必要。 在这一点上,这已成为一种骄傲/好奇心问题。

谢谢!

你不能创建一个协变ICollection ,因为它允许你把T放入其中。

您可以创建协变的只读集合,逆变的只写集合或不变的读写集合。
你不能两者都做,或者它不是类型安全的。

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