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?
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?
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.
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.
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
Dodatkowo, co mówili inni, masz następujące też:
+1 To jest dość kompresyjne. Chciałabym móc faworyzować odpowiedź. – Sung