C#界面限制

xgp*_*xgp 7 c# generics

我正在尝试使用Generic Constraints.在声明类的约束时如此:

    public class DocumentPrinter<T> where T : IFooDoc
Run Code Online (Sandbox Code Playgroud)

我能够在DocumentPrinter类的方法中访问IFooDoc声明的方法.但是,如果我使DocumentPrinter实现一个声明约束的接口,例如:

public interface IDocumentPrinter<T> where T : IFooDoc
{
    void Add(T fooDoc);
    void PrintFoos();
}
Run Code Online (Sandbox Code Playgroud)

然后将DocumentPrinter声明为:

   public class DocumentPrinter<T>: IDocumentPrinter<T>
Run Code Online (Sandbox Code Playgroud)

IFooDoc实例的属性/方法在Document打印机的方法中不再可用.似乎我必须在类本身声明一个接口约束,如果我要访问该类型声明的成员.

我是否正确理解这一点,或者是否可以在接口上声明约束并让类实现该约束?

jas*_*son 8

我是否正确理解这一点,或者是否可以在接口上声明约束并让类实现该约束?

正确.你1来声明泛型类的类型参数的约束.仅仅因为你将type参数命名为与type参数DocumentPrinter<T>同名,IDocumentPrinter<T>并不意味着它们是相同的类型.当你申报时

public class DocumentPrinter<T> : IDocumentPrinter<T>
Run Code Online (Sandbox Code Playgroud)

你实际上是在说使用T参数化DocumentPrinter<T>参数化IDocumentPrinter<T>,现在它们是相同的类型.但要做到合法,TDocumentPrinter<T>必须满足对类型参数的所有限制IDocumentPrinter<T>.因此,你必须明确地说T满足T : IFooDoc.

1:显然我需要明确说明.如果您没有执行语言规范要求您执行的操作,则您的代码将无法编译.语言规范要求在参数化泛型类型时,使用它参数化的类型必须满足该泛型类型的该类型参数的所有约束.如果不这样做,您的代码将无法编译.