2009-03-07 10 views
11

Co oznacza where T : somevalue? Właśnie zobaczyłem kod, który powiedział: where T : Attribute. Myślę, że ma to coś wspólnego z rodzajami, ale nie jestem pewien, co to oznacza i co robi.Co oznacza "where T: somevalue"?

Czy ktoś wie?

Odpowiedz

28

Jest constraint on a type parameter, co oznacza, że ​​typ T podane do ogólnej klasy lub metody musi dziedziczyć z klasy Attribute

Na przykład:

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 

Jest to użyteczne, ponieważ pozwala rodzajową klasa do robienia rzeczy z obiektami typu T ze świadomością, że wszystko co jest T musi być także Attribute.

W powyższym przykładzie, to jest w porządku dla GetTypeId kwerendy TypeId z attr ponieważ TypeId jest właściwością Attribute, a ponieważ attr jest T musi być typem, który dziedziczy z Attribute.

Ograniczenia mogą być również wykorzystywane na metodach generycznych, z tym samym skutkiem:

public static void GetTypeId<T>(T attr) where T : Attribute 
{ 
    return attr.TypeId.ToString(); 
} 

Istnieją inne ograniczenia można umieścić na typ; z MSDN:

where T: struct

typu argument musi być wartością typu. Można podać dowolny typ wartości, z wyjątkiem wartości Nullable .

where T : class

typ argumentu musi być odniesienie typu; dotyczy to również dowolnego interfejsu klasy, delegata lub typu klasy: .

where T : new()

typu argument musi mieć publicznego konstruktora bez parametrów . W przypadku użycia wraz z innymi ograniczeniami, ograniczenie new() musi być określone jako ostatnie .

where T : <base class name>

Argument type musi być albo czerpać z określonej klasy bazowej.

where T : <interface name>

typ argumentu musi być albo realizować określony interfejs. Wiele ograniczeń interfejsu można ustawić na . Interfejs ograniczający może być również ogólny.

where T : U

typ argumentu dostarczane do T musi być albo wywodzą się z argumentu dostarczanej do litery U. Jest to nazywane nagi do kolumny.

+0

+1 To jest dość kompresyjne. Chciałabym móc faworyzować odpowiedź. – Sung

1

Klauzula where służy do ograniczenia argumentów, które można przekazać przy użyciu generycznych. Kiedy tworzysz klasę ogólną, może być w twoim najlepszym interesie określenie typu argumentu w zależności od tego, jak zamierzasz używać T w klasie. Jeśli coś oprócz tego, co potrafi System.Object, prawdopodobnie najlepiej jest użyć constraint, ponieważ dostaniesz błąd kompilacji w stosunku do środowiska wykonawczego.

przykład

Jeśli utworzyć klasę

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

nie można nie zdać tej klasie nic, że nie wykona IComparable. Dlatego teraz można bezpiecznie używać polecenia CompareTo do wszystkiego, co jest przekazywane do klasy Person.

1

Jest to sposób na ograniczenie typu używanego jako argumenty ogólne. Więc:

where T : SomeType 

Środki że T musi albo wynikających z SomeType lub implementować interfejs SomeType

5

Dodatkowo, co mówili inni, masz następujące też:

  • nowy () - T musi mieć domyślny konstruktor
  • klasa - T musi być typem odniesienia
  • struct - T musi być wartością typu