为什么我得到“类型参数必须是无效的……”错误?
我将尝试缩短此代码示例:
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
。