Можете ли вы объяснить мне, что where T : class, new()
означает в следующей строке кода?
void Add<T>(T item) where T : class, new();
c#
generics
type-constraints
Rawhi
источник
источник
Ответы:
Это ограничение общего параметра
T
. Он должен бытьclass
(ссылочный тип) и должен иметь открытый конструктор по умолчанию без параметров.Это означает
T
не может бытьint
,float
,double
,DateTime
или любой другойstruct
(тип значения).Это может быть
string
или любой другой пользовательский ссылочный тип, если он имеет конструктор по умолчанию или без параметров.источник
new()
точно указывает «должен иметь открытый конструктор без параметров»Это ограничения общего типа. В вашем случае их два:
Означает, что тип
T
должен быть ссылочным типом (а не типом значения).Означает, что тип
T
должен иметь конструктор без параметров. Наличие этого ограничения позволит вам сделать что-то подобноеT field = new T();
в вашем коде, что вы не сможете сделать иначе.Затем вы объединяете их, используя запятую, чтобы получить:
источник
где T: структура
Аргумент типа должен быть типом значения. Можно указать любой тип значения, кроме Nullable. Посмотрите Использование Обнуляемых Типов (Руководство по программированию C #) для получения дополнительной информации.
где Т: класс
Аргумент типа должен быть ссылочным типом, включая любой класс, интерфейс, делегат или тип массива. (См. Примечание ниже.)
где T: new () Аргумент типа должен иметь открытый конструктор без параметров. При использовании в сочетании с другими ограничениями ограничение new () должно указываться последним.
где T: [имя базового класса]
Аргумент типа должен быть или наследоваться от указанного базового класса.
где T: [имя интерфейса]
Аргумент типа должен быть или реализовывать указанный интерфейс. Можно указать несколько ограничений интерфейса. Ограничивающий интерфейс также может быть универсальным.
где Т: У
Аргумент типа, предоставленный для T, должен быть или получен из аргумента, предоставленного для U. Это называется ограничением типа «голый».
источник
class
&new
2 ограничения на параметр общего типаT
.Соответственно они обеспечивают:
class
new
Их комбинация означает, что тип
T
должен быть ссылочным типом (не может быть типом значения ) и должен иметь конструктор без параметров.Пример:
источник
new (): Указание ограничения new () означает, что тип T должен использовать конструктор без параметров, поэтому объект может быть создан из него - см. Конструкторы по умолчанию .
class: означает, что T должен быть ссылочным типом, поэтому он не может быть int, float, double, DateTime или другой структурой (тип значения).
источник
Это означает, что тип
T
должен быть классом и иметь конструктор, который не принимает никаких аргументов.Например, вы должны быть в состоянии сделать это:
источник
где (C # ссылка)
Так и должно быть,
T
должен быть класс и иметь доступный конструктор без параметров или по умолчанию.источник
После «Где» находится ограничение на общий тип T, который вы объявили, поэтому:
класс означает, что T должен быть классом, а не типом значения или структурой.
new () указывает, что класс T должен иметь открытый конструктор по умолчанию без параметров.
источник
Он называется «ограничением» для универсального параметра T. Это означает, что T должен быть ссылочным типом (классом) и иметь открытый конструктор по умолчанию.
источник
Это часть механизма Generics, в котором ключевое слово where добавляет ограничения к тем типам, которые должны быть реализованы для использования в качестве параметров типа.
источник
при использовании класса в ограничениях это означает, что вы можете использовать только ссылочный тип, еще одна вещь, которую нужно добавить, - когда использовать ограничение new () , это должно быть последним, что вы пишете в терминах ограничений.
источник