bir jenerik sınıf veya yönteme verilen tip T
Örneğin sınıfın Attribute
devralınmalıdır yani bir constraint on a type parameter şudur: jenerik izin verdiğinden
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
faydalıdır, T
türünde bir nesneye sahip olan nesnelerin T
türünde olduğu gibi bir nesnenin de Attribute
olması gerekir. TypeId
bir Attribute
bir özelliktir çünkü GetTypeId
attr
ait TypeId
sorgulamak için yukarıdaki örnekte
, sorun değil ve attr
bir T
olduğu için Attribute
devralan bir türü olmalıdır.
Kısıtlamalar da aynı etkiye sahip, jenerik yöntemlerine kullanılabilir:
public static void GetTypeId<T>(T attr) where T : Attribute
{
return attr.TypeId.ToString();
}
bir türüne yerleştirebilirsiniz başka kısıtlamalar vardır; MSDN den:
where T: struct
tür bağımsız değişkeni bir değer türü olmalıdır. Nullable hariç herhangi bir değer türü belirtilebilir.
where T : class
tipi bağımsız değişken bir referans türü; Bu, herhangi bir sınıf için de geçerlidir, arabirimi, temsilci veya dizi türü.
where T : new()
tip argüman kamu parametresiz yapıcı olması gerekir. diğer kısıtlamalarla birlikte kullanıldığında, yeni() kısıtlaması en son belirtilmelidir.
where T : <base class name>
tipi argüman veya belirtilen temel sınıfından türetilmelidir.
where T : <interface name>
tipi bağımsız değişken olabilir ya da belirtilen arayüz uygulamalıdır. Birden çok arabirim kısıtlaması belirtilebilir. Kısıtlama ara yüzü da jenerik olabilir.
where T : U
T için sağlanan tip bağımsız değişken olmalıdır olabilir ya da bir çıplak tür kısıtlaması olarak adlandırılır U. Bu için sağlanan değişken kaynaklanmaktadır.
+1 Bu oldukça zorlayıcıdır. Bir cevabı favori olarak seçebilseydim. – Sung