C#接口约束

时间:2013-06-30 14:32:59

标签: c# generics

我正在尝试使用通用约束。在声明类的约束时如此:

    public class DocumentPrinter<T> where T : IFooDoc

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

public interface IDocumentPrinter<T> where T : IFooDoc
{
    void Add(T fooDoc);
    void PrintFoos();
}

然后将DocumentPrinter声明为:

   public class DocumentPrinter<T>: IDocumentPrinter<T>

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

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

2 个答案:

答案 0 :(得分:8)

  

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

正确。您 1 也要声明对泛型类的类型参数的约束。仅仅因为您将DocumentPrinter<T>中的类型参数命名为与IDocumentPrinter<T>中的类型参数同名并不意味着它们是相同的类型。当你宣布

public class DocumentPrinter<T> : IDocumentPrinter<T>

您实际上是在说T参数化DocumentPrinter<T>参数化IDocumentPrinter<T>现在它们是相同的类型。但为了使其合法,T DocumentPrinter<T>必须满足IDocumentPrinter<T>的类型参数的所有约束。因此,您必须明确说明T满足T : IFooDoc

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

答案 1 :(得分:3)

  

文档打印机

的方法中不再提供IFooDoc实例的属性/方法

嗯,当您的代码无法编译时,IntelliSense告诉您的是无关紧要的。

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