2011-01-03 13 views
19

私はこれをgoogleにしようとしましたが、普通のクラス宣言に関する文書しか見つかりませんでした。私はクラスがIDataContextWrapperを実装していることがわかりC#クラスの宣言で「どこ」が意味するのでしょうか?

public class DataContextWrapper<T> : IDataContextWrapper where T : DataContext, new() 
{ 

} 

、DataContextのを継承し、それがインスタンス化される方法に応じて、型Tによって異なります。

「」または「, new()」はどういう意味かわかりません。

+7

言語の構文について質問がある場合はC#の仕様を読むことを検討してください。それはかなり詳細です。 –

答えて

38

generic constraintであり、ジェネリックパラメータに渡すことができるタイプを制限します。

Tは、DataContextと矛盾しているか、または派生し、デフォルトの(引数のない)コンストラクタ(new()の制約)が必要です。

ジェネリック型を使用することで、実際には何かを行うには一般的な制約が必要です。

  • new()の制約では、new T()でインスタンスを作成できます。
  • DataContext制約を使用すると、MSDNが書いたT

のインスタンスにDataContextのメソッドを呼び出すことができます:

where T : <base class name> 型引数があるか、指定された基本クラスから派生しなければなりません。

where T : new() type引数には、パラメータのないパブリックコンストラクタが必要です。他の制約と一緒に使用する場合、new()制約は最後に指定する必要があります。

+1

+1ただし、T:classがT:SomeClassNameと異なる場合、MSDNスニペットの最初の部分はOPとは関係ありません。 – KeithS

+0

@KeithS oops、fixed it – CodesInChaos

+0

@CodeInChaos - 優れた答え。私は不思議ですが、なぜ誰かが実際のタイプ(例:T:DataContext)を指定するのでしょうか。ジェネリックの全ポイントは、実行時に型を指定することです。 –

13

DataContextから派生した、または実装するT型のみを許可し、引数を取らないパブリックコンストラクタを使用します。

+1

'T'は非抽象型でもなければなりません。これは 'new()'制約が課されたときに 'new T()'を呼び出すことが合法なので重要です。また、 'DataContext'がクラスである場合、' T' *は 'DataContext'自身(それから派生するのではなく)である可能性があります。 – Ani

5

これは一般的なタイプの制限です。この場合、TはDataContextから継承し、引数を取らないコンストラクタを持つ型でなければなりません。

+3

参照型である必要はありません。 'new()'も構造体に適用されます。 –

+0

ありがとうございます。私は私の答えを訂正しました。 –

4

ここで、T:DataContextは次のようになります。Tは、(またはから派生した)DataContextでなければなりません。 "、new()"は:パラメータなしコンストラクタが必要です。

9

generic type constraintであり、ジェネリック型(たとえば、クラスのみ、または特定のインターフェイスを実装する必要がある)に制約を指定します。この場合

TのいずれかであるDataContext又はそれを継承し、パラメータなしのパブリックコンストラクタ(new()制約)を有していなければならないクラスでなければなりません。

4

whereキーワードは、汎用タイプの変数を制約するために使用されます。つまり、タイプTDataContextである必要があり、パブリックのデフォルトコンストラクタを含める必要があります。

+0

これは "*デフォルトのコンストラクタを含める必要があります" – Richard

+0

はい、そうです:)。 –

2

ジェネリックとして使用できるタイプの制約です。これにより、コンパイラのチェックに加えて、Tで意味のある何かを行うことができるようになります。

です。 new()は、Tにパラメータのないコンストラクタが必要であることをコンパイラに伝えます。これは、new T();と書いてTのインスタンスをインスタンス化できることを意味し、TもDataContextであることを知ることで、Tのインスタンスを作成することも、そのメソッドを呼び出すこともできます。

2

を参照してくださいがT.ザ・新しいの種類に制約を置くことがあるタイプのTは、パラメータなしでインスタンス化しなければならないことを述べています。すなわちT thing = new T();

もっと見るhere

関連する問題