0

我有两个接口,

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?)

但是当我施放它时,它只是返回为空。如果我将其更改为:

IDocument<MySegment> doc = new MyDocument();

它有效,就像我将类定义更改为

public class MyDocument : IDocument<ISegment>

为什么我不能为 IDocument 的实现强制实现 ISegment 的特定类型?我想将此代码重新用于不同类型的代码,IDocument也许ISegment有一天某些实现IDocument将允许多种类型,ISegmentMyDocument应限制这种行为。我如何才能强制执行这些要求,但仍然编写足够通用的代码以供将来重用?

4

2 回答 2

3

您需要了解共同反差的讨厌情况:

public interface IDocument<out SegType> where SegType : ISegment
{}

我认为这应该使您的示例现在可以编译...

这里有一些阅读材料:

于 2013-03-01T21:53:10.040 回答
0

因为IDocument<MySegment>不能直接转换为IDocument<ISegment>. 如果可以,您可以这样做:

IDocument<ISegment> doc1 = new IDocument<MySegment>;
doc1.Add(new MyOtherSegment());   // invalid

(假设IDocument<T>有一个Add(T newSegment)方法)

仔细查看您的设计并确定泛型是否真的需要,或者仅使用ISegmentwithinIDocument就足够了。

于 2013-03-01T21:55:17.660 回答