Что делает “где T: somevalue”, средний?

Это должен быть комментарий, но у меня нет этих преимуществ.

Это должно быть потому, что console.log вызывается в цикле for.

Следующий код должен работать.

for (i = 0; i < recommendedTasks.length; i++) { 
  console.log(recommendedTasks[i])
}

Опять же, я хотел бы прокомментировать. Надеюсь, это поможет вам!

11
задан cgreeno 17 March 2009 в 14:21
поделиться

4 ответа

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

В примере выше, это хорошо для GetTypeId запрашивать TypeId из attr потому что TypeId свойство Attribute, и потому что attr a 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()

Аргумент типа должен иметь общедоступного конструктора без параметров. При использовании вместе с другими ограничениями, новое (), ограничение должно быть указано в последний раз.

where T : <base class name>

Аргумент типа должен быть или произойти из указанного базового класса.

where T : <interface name>

Аргумент типа должен быть или реализовать указанный интерфейс. Могут быть указаны несколько интерфейсных ограничений. Интерфейс ограничения может также быть универсальным.

where T : U

Аргумент типа, предоставленный для T, должен быть или произойти из аргумента, предоставленного для U. Это называют явным ограничением типа.

28
ответ дан 3 December 2019 в 02:02
поделиться

Дополнительно, что другие сказали, у Вас есть следующее также:

  • новый () - T должен иметь конструктора по умолчанию
  • класс - T должен быть ссылочным типом
  • структура - T должна быть типом значения
5
ответ дан 3 December 2019 в 02:02
поделиться

Это - способ ограничить тип, используемый в качестве универсальных аргументов. Так:

where T : SomeType

Средства, которые T должен или получить из SomeType или реализовать интерфейс SomeType

1
ответ дан 3 December 2019 в 02:02
поделиться

Где пункт используется для ограничения аргументов, которые могут быть переданы при использовании дженериков. При создании универсального класса, это могло бы быть в интересах указать тип аргумента в зависимости от того, как Вы планируете использовать T в своем классе. Если это что-либо, помимо какой Система. Объект может сделать затем, вероятно, лучше использовать ограничение, поскольку Вы получите ошибку времени компиляции по сравнению со временем выполнения.

пример

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

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

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

1
ответ дан 3 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: