Подтвердить что ты не робот

Что означает "где T: некоторое значение"?

Что означает where T : somevalue? Я только что увидел код, который сказал where T : Attribute. Я думаю, что это имеет какое-то отношение к дженерикам, но я не уверен, что это значит или что он делает.

Кто-нибудь знает?

4b9b3361

Ответ 1

Это ограничение для параметра типа, что означает, что тип 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. Это называется голым тип.

Ответ 2

Кроме того, что сказали другие, у вас тоже есть следующее:

  • new() - T должен иметь конструктор по умолчанию
  • class - T должен быть ссылочным типом
  • struct - T должен быть тип значения

Ответ 3

Предложение where используется для ограничения аргументов, которые могут быть переданы при использовании дженериков. Когда вы создаете общий класс, вам может потребоваться указать тип аргумента в зависимости от того, как вы планируете использовать T в своем классе. Если это что-то помимо того, что может сделать System.Object, вероятно, лучше использовать ограничение, поскольку вы получите ошибка времени компиляции и время выполнения.

Пример

Если вы создаете класс

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

Вы не можете передать этому классу все, что не реализует IComparable. Поэтому теперь безопасно использовать CompareTo для всего, что передается в класс Person.

Ответ 4

Это способ ограничения типа, используемого в качестве общих аргументов. Итак:

where T : SomeType

означает, что T должен либо выводиться из SomeType, либо реализовать интерфейс SomeType