Это должен быть комментарий, но у меня нет этих преимуществ.
Это должно быть потому, что console.log
вызывается в цикле for.
Следующий код должен работать.
for (i = 0; i < recommendedTasks.length; i++) {
console.log(recommendedTasks[i])
}
Опять же, я хотел бы прокомментировать. Надеюсь, это поможет вам!
Это - ограничение на параметр типа, означая что тип 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. Это называют явным ограничением типа.
Дополнительно, что другие сказали, у Вас есть следующее также:
Это - способ ограничить тип, используемый в качестве универсальных аргументов. Так:
where T : SomeType
Средства, которые T должен или получить из SomeType или реализовать интерфейс SomeType
Где пункт используется для ограничения аргументов, которые могут быть переданы при использовании дженериков. При создании универсального класса, это могло бы быть в интересах указать тип аргумента в зависимости от того, как Вы планируете использовать T в своем классе. Если это что-либо, помимо какой Система. Объект может сделать затем, вероятно, лучше использовать ограничение, поскольку Вы получите ошибку времени компиляции по сравнению со временем выполнения.
пример
Если Вы создаете класс
class Person<T> where T : System.IComparable<T>
{
//can now use CompareTo
}
Вы не можете не передать этот класс ничто, что не реализует IComparable. Таким образом, теперь безопасно использовать CompareTo на чем-либо, что передается в класс Человека.