我有两个接口,
public interface IDocument<SegType> where SegType : ISegment
和
public interface ISegment
基本上,我想强制实现IDocument
的每个类都由一种ISegment
组成,使用这些类的人永远不需要知道ISegment
的类型他们的班级在内部使用。
然后我创建了一个实现IDocument<SegType> where SegType : ISegment
的类:
public class MyDocument : IDocument<MySegment>
和相应的MySegment
:
public class FffSegment : ISegment
当我指定MyDocument
作为类型时,所有这些编译和工作正如我所期望的那样。为什么我不能隐式地将MyDocument
的实例强制转换为类型IDocument<Isegment>
?当我尝试这条线时:
IDocument<ISegment> doc = new MyDocument();
我收到错误
Cannot implicitly convert type 'MyDocument' to 'IDocument<ISegment>'. An explicit conversion exists (are you missing a cast?)
但是当我施展它时,它只会返回null。如果我将其更改为:
IDocument<MySegment> doc = new MyDocument();
它可以正常工作,就像我将类定义更改为
时一样public class MyDocument : IDocument<ISegment>
为什么我不能强制为IDocument实现强制实现ISegment的特定类型?我想对不同类型的IDocument
和ISegment
重复使用此代码,也许有一天IDocument
的某些实现将允许多种类型的ISegment
但{{1}应该限制这种行为。我如何强制执行这些要求,但仍然编写通用的代码,以便将来重复使用?
答案 0 :(得分:3)
你需要进入相互矛盾的差异:
public interface IDocument<out SegType> where SegType : ISegment
{}
我认为现在应该让你的例子编译......
以下是一些阅读材料:
答案 1 :(得分:0)
因为IDocument<MySegment>
无法直接投放到IDocument<ISegment>
。如果可以的话,你可以这样做:
IDocument<ISegment> doc1 = new IDocument<MySegment>;
doc1.Add(new MyOtherSegment()); // invalid
(假设IDocument<T>
有Add(T newSegment)
方法)
仔细查看您的设计,并确定是否真的有必要使用泛型,或者只是在ISegment
内使用IDocument
就足够了。