2009-03-07 17 views
11

where T : somevalue ne anlama geliyor? Az önce where T : Attribute dediğim bir kod gördüm. Bunun jeneriklerle ilgili bir şey olduğunu düşünüyorum ama bunun ne anlama geldiğini veya ne yaptığını bilmiyorum."Nerede T: somevalue" ne anlama geliyor?

Kimse biliyor mu?

cevap

28

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ü GetTypeIdattr 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.

+0

+1 Bu oldukça zorlayıcıdır. Bir cevabı favori olarak seçebilseydim. – Sung

1

where maddesi jenerik kullanıldığında geçirilebilir argümanlar sınırlamak için kullanılır. Genel bir sınıf oluşturduğunuzda, sınıfınızda T'yi nasıl kullanmayı planladığınıza bağlı olarak bir argüman türü belirtmek sizin çıkarınıza olabilir. System.Object öğesinin ne yapabileceğinin yanı sıra, bir çalışma zamanı gibi bir derleme zamanı hatası alacağınız için muhtemelen constraint kullanmak en iyisidir.

örnek

Bir sınıfı

class Person<T> where T : System.IComparable<T> 
{ 
    //can now use CompareTo 
} 

oluşturursanız Sen IComparable uygulamıyor bu sınıf şey geçemez olamaz. Dolayısıyla, Now sınıfını Kişi sınıfına aktarılan herhangi bir şey üzerinde kullanmak artık güvenlidir.

1

Genel argüman olarak kullanılan türü kısıtlamanın bir yolu. Yani:

where T : SomeType 

T ya sometype türetmek veya arayüz sometype diğerleri, sen de şu var söylediklerini Ayrıca

5

uygulamalıdır: Means

  • yeni () - T varsayılan kurucu
  • sınıfına sahip olmalıdır - T, referans tipi olmalıdır
  • struct - T, bir değer türü olmalıdır