使用没有泛型参数的类实现的泛型参数的转换接口

时间:2013-03-01 21:49:13

标签: c# generics inheritance

我有两个接口,

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的特定类型?我想对不同类型的IDocumentISegment重复使用此代码,也许有一天IDocument的某些实现将允许多种类型的ISegment但{{1}应该限制​​这种行为。我如何强制执行这些要求,但仍然编写通用的代码,以便将来重复使用?

2 个答案:

答案 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就足够了。