where T : somevalue
の意味は?私はちょうどwhere T : Attribute
と言ったコードを見た。これはジェネリックと何か関係があると思いますが、これが何を意味するのか、それが何をしているのかは分かりません。「T:somevalue」はどういう意味ですか?
誰でも知っていますか?
where T : somevalue
の意味は?私はちょうどwhere T : Attribute
と言ったコードを見た。これはジェネリックと何か関係があると思いますが、これが何を意味するのか、それが何をしているのかは分かりません。「T:somevalue」はどういう意味ですか?
誰でも知っていますか?
それはジェネリッククラスまたはメソッドに指定された型T
は、例えば、クラスAttribute
から継承しなければならないことを意味し、constraint on a type parameterである:それは一般的なことができますので
public class Foo<T> :
where T : Attribute
{
public string GetTypeId(T attr) { return attr.TypeId.ToString(); }
// ..
}
Foo<DescriptionAttribute> bar; // OK, DescriptionAttribute inherits Attribute
Foo<int> baz; // Compiler error, int does not inherit Attribute
これは、便利ですクラスT
のオブジェクトを使ってオブジェクトを処理するには、T
の何ものもAttribute
でなければならないという知識が必要です。上記の例では
TypeId
がAttribute
の財産であり、attr
がT
あるので、それはAttribute
から継承するタイプでなければならないので、それはattr
のTypeId
を照会するGetTypeId
ために大丈夫です。
制約も同じ効果で、一般的な方法で使用することができます。
public static void GetTypeId<T>(T attr) where T : Attribute
{
return attr.TypeId.ToString();
}
あなたがタイプに置くことができる他の制約があります。 MSDNから:
where T: struct
type引数は値 型でなければなりません。 Nullable を除く任意の値型を指定できます。
where T : class
型引数が参照 タイプでなければなりません。これはどのクラス、 インターフェイス、デリゲート、または配列タイプにも当てはまります。
where T : new()
型引数は、公共 パラメータなしのコンストラクタを持っている必要があります。 を他の制約と共に使用すると、 が最後に指定されなければなりません。 new()制約を最後に指定する必要があります。
where T : <base class name>
型引数があるか、指定された基本クラスから を派生しなければなりません。
where T : <interface name>
型引数があるか 指定されたインタフェースを実装する必要があります。複数の インターフェイスの制約は に指定できます。拘束インターフェイス も汎用品にすることができます。
where T : U
T、指定された型引数は であるか、または はこれが裸 型制約と呼ばれているU.のために与えられた引数から派生しなければなりません。
where節は、ジェネリックを使用するときに渡すことができる引数を制限するために使用されます。ジェネリッククラスを作成するときは、クラスでTをどのように使用するかによって、引数の型を指定することをお勧めします。 System.Objectが何をすることができるか以外に何かがある場合は、constraintを使用することをお勧めします。これは、コンパイル時エラーとランタイムを取得するためです。
例
あなたはクラス
class Person<T> where T : System.IComparable<T>
{
//can now use CompareTo
}
を作成する場合は、IComparableを実装していません。このクラスは何も渡さないですることはできません。したがって、Personクラスに渡されたものに対してCompareToを使用することは今や安全です。
一般的な引数として使用する型を制限する方法です。だから、:
where T : SomeType
TはどちらかがSomeTypeから派生またはインタフェースSomeType他の人が、あなたも以下の持って言ったことに加え
を実装しなければならないことを意味:
+1これはかなり包括的です。私は答えを好きになることを願っています。 – Sung