2013-06-30 16 views
7

私はGeneric Constraintsを試しています。ようにクラスに制約を宣言する場合:C#インターフェイスの制約

public class DocumentPrinter<T> where T : IFooDoc 

を私はDocumentPrinterクラスのメソッド内IFooDocによって宣言されたメソッドにアクセスすることができています。しかし、私が作る場合DocumentPrinterはcontraintを宣言するインターフェース、例えば実装:

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

をして、そのようDocumentPrinterを宣言していない:IFooDocインスタンスの

public class DocumentPrinter<T>: IDocumentPrinter<T> 

プロパティ/メソッドは、メソッドの中に使用できなくなっていますドキュメントプリンターの。その型で宣言されたメンバーにアクセスするには、クラス自体にインターフェイス制約を明示的に宣言する必要があるようです。

私はこれを正しく理解していますか、またはインターフェイスで制約を宣言して、その制約をクラスで実現できるのですか?

答えて

8

私はこれを正しく理解していますか、またはインターフェイスで制約を宣言し、その制約をクラスで実現することは可能ですか?

正しい。 には があり、ジェネリッククラスの型パラメーターにも制約が宣言されています。 DocumentPrinter<T>のtypeパラメーターの名前をIDocumentPrinter<T>のtypeパラメーターと同じ名前に指定したということは、それらが同じタイプであるということではありません。あなたは

public class DocumentPrinter<T> : IDocumentPrinter<T> 

を宣言するとき、あなたはIDocumentPrinter<T>は今、彼らは同じ型でパラメータ化するDocumentPrinter<T>をパラメータTを使用するように言って、実際にされています。しかし、それが法的であるためには、TからDocumentPrinter<T>まではIDocumentPrinter<T>の型パラメータのすべての制約を満たさなければなりません。したがって、TT : IFooDocを満たすと明示的に言う必要があります。

:明らかにこれを明示する必要があります。言語仕様で必要なことをしないと、コードはコンパイルされません。言語仕様では、ジェネリック型をパラメータ化するときに、それをパラメータ化する型は、そのジェネリック型の型パラメータのすべての制約を満たす必要があります。そうしないと、コードはコンパイルされません。 IFooDocインスタンスの

+0

これは誤解を招きます。メンバにアクセスできるようにクラスに制約を追加する必要はありません。コンパイルするコードに追加する必要があります。 – svick

+0

@svick:「*私はこれを正しく理解していますか、またはインタフェースに制約を宣言し、その制約をクラスで実現できるのですか?」「私の答えが誤解を招くかどうかはわかりません。あなたが*私の答えで指定したように*制約を宣言しなければならない場合、あなたがしなければ暗黙の*があります。あなたがする言語*が必要な何かをやっていないので、コードはコンパイルされませんコンパイルされないコードがあります。しかし、もう一度、問題は*私はこれをしなければならないか、それとも明確にすることなくそれを行う方法があるのですか?*私はその質問に答えました。ダウンフロー? – jason

+0

質問:「タイプ*で宣言されたメンバーにアクセスするには、クラスそのものにインタフェース制約を明示的に宣言する必要があるようです」と言われました。これはOP *コンパイル*しません。だから私はそれを強調することが重要だと思うのです。 – svick

3

プロパティ/メソッドは、ドキュメントのプリンタ

まあの方法の中にはもはや利用可能であり、それはあなたのコードはをコンパイルしていないときを告げる何のIntelliSense種類の無関係ません。

IDocumentPrinter<T>を実装する場合は、には制約があります。があります。そうしないと、コードはコンパイルされません。

関連する問題