Что означает where T : somevalue
? Я только что увидел код, который сказал where T : Attribute
. Я думаю, что это имеет какое-то отношение к дженерикам, но я не уверен, что это значит или что он делает.
Кто-нибудь знает?
Что означает where T : somevalue
? Я только что увидел код, который сказал where T : Attribute
. Я думаю, что это имеет какое-то отношение к дженерикам, но я не уверен, что это значит или что он делает.
Кто-нибудь знает?
Это ограничение для параметра типа, что означает, что тип T
, присвоенный родовому класс или метод должны наследовать от класса Attribute
Например:
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
.
В приведенном выше примере для GetTypeId
можно запросить TypeId
из attr
, потому что TypeId
является свойством Attribute
, а поскольку attr
является T
, он должен быть тип, который наследуется от Attribute
.
Ограничения также могут использоваться для общих методов с тем же эффектом:
public static void GetTypeId<T>(T attr) where T : Attribute
{
return attr.TypeId.ToString();
}
Существуют и другие ограничения, которые вы можете поместить на тип; от MSDN:
where T: struct
Аргумент типа должен быть значением тип. Любой тип значения, кроме 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, вероятно, лучше использовать ограничение, поскольку вы получите ошибка времени компиляции и время выполнения.
Пример
Если вы создаете класс
class Person<T> where T : System.IComparable<T>
{
//can now use CompareTo
}
Вы не можете передать этому классу все, что не реализует IComparable. Поэтому теперь безопасно использовать CompareTo для всего, что передается в класс Person.
Это способ ограничения типа, используемого в качестве общих аргументов. Итак:
where T : SomeType
означает, что T должен либо выводиться из SomeType, либо реализовать интерфейс SomeType