C#接口约束

C#接口约束,c#,generics,C#,Generics,我正在试验通用约束。在类上声明约束时,如下所示: public class DocumentPrinter<T> where T : IFooDoc 公共类文档打印机,其中T:IFooDoc 我能够在DocumentPrinter类的方法中访问IFooDoc声明的方法。但是,如果我让DocumentPrinter实现一个声明合同的接口,例如: public interface IDocumentPrinter<T> where T : IFooDoc {

我正在试验通用约束。在类上声明约束时,如下所示:

    public class DocumentPrinter<T> where T : IFooDoc
公共类文档打印机,其中T:IFooDoc
我能够在DocumentPrinter类的方法中访问IFooDoc声明的方法。但是,如果我让DocumentPrinter实现一个声明合同的接口,例如:

public interface IDocumentPrinter<T> where T : IFooDoc
{
    void Add(T fooDoc);
    void PrintFoos();
}
公共接口IDocumentPrinter,其中T:IFooDoc
{
无效添加(T fooDoc);
void PrintFoos();
}
然后将DocumentPrinter声明为:

   public class DocumentPrinter<T>: IDocumentPrinter<T>
公共类文档打印机:IDocumentPrinter
IFooDoc实例的属性/方法在文档打印机的方法中不再可用。如果要访问由类型声明的成员,似乎必须显式地在类本身上声明接口约束

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

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

对。您还需要声明泛型类的类型参数上的约束。您在
DocumentPrinter
中将类型参数命名为与
IDocumentPrinter
中的类型参数同名,这并不意味着它们是相同的类型。当你申报时

public class DocumentPrinter<T> : IDocumentPrinter<T>
公共类文档打印机:IDocumentPrinter
实际上,您是说使用参数化
DocumentPrinter
T
来参数化
IDocumentPrinter
,现在它们是相同的类型。但要使其合法,来自
DocumentPrinter
T
必须满足
IDocumentPrinter
的类型参数的所有约束。因此,您必须明确地说
T
满足
T:IFooDoc

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

IFooDoc实例的属性/方法在文档打印机的方法中不再可用

嗯,当你的代码没有编译时,IntelliSense告诉你什么是无关紧要的


如果要实现
IDocumentPrinter
,则必须满足其约束条件。如果您不这样做,您的代码将无法编译。

这是一种误导,您不必向类中添加约束来访问成员,您必须添加约束才能编译代码。@svick:前面提到的问题是“我是否正确理解这一点,或者是否可以在接口上声明约束,并让类实现该约束?“我不知道我的回答有多误导。如果您必须按照我在回答中指定的方式声明约束,则会有一个隐式表达式,如果您不声明约束,代码将不会编译,因为任何时候您不执行语言要求您执行的操作,您的代码都不会编译。但再一次,问题是我是否必须这样做,或者是否有一种方法可以在不明确的情况下这样做。我回答了那个问题。Downovting?问题是:“如果我要访问由类型声明的成员,我似乎必须显式地在类本身上声明接口约束。”对我来说,这表明OP没有意识到代码不会编译。这就是为什么我认为强调这一点很重要。@svick:我对OP的评价比这还要高。当代码无法编译时,使用IDE或命令行编译器通常是非常明显的。感谢您的澄清!这就是我需要知道的。