Что означает "where T: class, new ()"?
не могли бы вы объяснить мне, что where T : class, new()
значит в следующей строке кода?
void Add<T>(T item) where T : class, new();
10 ответов
это ограничение на общий параметр T
. Это должно быть class
(ссылочный тип) и должен иметь открытый конструктор без параметров по умолчанию.
что означает T
не может быть int
, float
, double
, DateTime
или любое другое struct
(тип значения).
это может быть string
или любой другой пользовательский ссылочный тип, если он имеет конструктор по умолчанию или без параметров.
это ограничения общего типа. В вашем случае их два:--7-->
where T : class
означает, что тип T
должен быть ссылочным типом (не тип значения).
where T : new()
означает, что тип T
должен иметь конструктор без параметров. Наличие этого ограничения позволит вам сделать что-то вроде T field = new T();
в вашем коде, который вы не смогли бы сделать иначе.
вы объедините два через запятую к вам:
where T : class, new()
где T: struct
аргумент type должен быть типом значения. Можно указать любой тип значения, кроме Nullable. Дополнительные сведения см. В разделе использование типов Nullable (руководство по программированию на C#).
где T : класс
аргумент type должен быть ссылочным типом, включая любой класс, интерфейс, делегат или тип массива. (См. Примечание ниже.)
где T: new () Аргумент типа должен иметь открытый конструктор без параметров. При использовании в сочетании с другими ограничениями ограничение new() должно быть указано последним.
где T : [имя класса]
аргумент типа должен быть или производным от указанного базового класса.
где T : [имя интерфейса]
аргумент type должен быть или реализовывать указанный интерфейс. Можно задать несколько интерфейсных ограничений. Ограничивающий интерфейс также может быть родовой.
где T: U
аргумент типа, предоставленный для T, должен быть или производным от аргумента, предоставленного для U. Это называется ограничением голого типа.
new (): указание ограничения new () означает, что тип T должен использовать конструктор без параметров, поэтому из него можно создать экземпляр объекта - см. конструкторы по умолчанию
класс: означает, что T должен быть ссылочным типом, поэтому он не может быть int, float, double, DateTime или другой структурой (тип значения).
public void MakeCars()
{
//This wont compile as researchEngine doesn't have a public constructor and so cant be instantiated.
CarFactory<ResearchEngine> researchLine = new CarFactory<ResearchEngine>();
var researchEngine = researchLine.MakeEngine();
//Can instantiate new object of class with default public constructor
CarFactory<ProductionEngine> productionLine = new CarFactory<ProductionEngine>();
var productionEngine = productionLine.MakeEngine();
}
public class ProductionEngine { }
public class ResearchEngine
{
private ResearchEngine() { }
}
public class CarFactory<TEngine> where TEngine : class, new()
{
public TEngine MakeEngine()
{
return new TEngine();
}
}
class
& 2 ограничения на параметр универсального типа T
.
Соответственно они обеспечивают:
class
аргумент типа должен быть ссылочным типом; это относится также к любому классу, интерфейсу, делегата или тип массива.
new
аргумент типа должен иметь открытый конструктор без параметров. При использовании вместе с другими ограничениями, новый() ограничение должно быть указано последним.
их комбинация означает, что тип T
должен быть Ссылка Типа (не может быть Тип Значения), и должен иметь конструктор без параметров.
пример:
struct MyStruct { } // structs are value types
class MyClass1 { } // no constructors defined, so the class implicitly has a parameterless one
class MyClass2 // parameterless constructor explicitly defined
{
public MyClass2() { }
}
class MyClass3 // only non-parameterless constructor defined
{
public MyClass3(object parameter) { }
}
class MyClass4 // both parameterless & non-parameterless constructors defined
{
public MyClass4() { }
public MyClass4(object parameter) { }
}
interface INewable<T>
where T : new()
{
}
interface INewableReference<T>
where T : class, new()
{
}
class Checks
{
INewable<int> cn1; // ALLOWED: has parameterless ctor
INewable<string> n2; // NOT ALLOWED: no parameterless ctor
INewable<MyStruct> n3; // ALLOWED: has parameterless ctor
INewable<MyClass1> n4; // ALLOWED: has parameterless ctor
INewable<MyClass2> n5; // ALLOWED: has parameterless ctor
INewable<MyClass3> n6; // NOT ALLOWED: no parameterless ctor
INewable<MyClass4> n7; // ALLOWED: has parameterless ctor
INewableReference<int> nr1; // NOT ALLOWED: not a reference type
INewableReference<string> nr2; // NOT ALLOWED: no parameterless ctor
INewableReference<MyStruct> nr3; // NOT ALLOWED: not a reference type
INewableReference<MyClass1> nr4; // ALLOWED: has parameterless ctor
INewableReference<MyClass2> nr5; // ALLOWED: has parameterless ctor
INewableReference<MyClass3> nr6; // NOT ALLOWED: no parameterless ctor
INewableReference<MyClass4> nr7; // ALLOWED: has parameterless ctor
}
это означает, что тип T
должен быть class и есть конструктор, который не принимает никаких аргументов.
например, вы должны быть в состоянии сделать это:
T t = new T();
ограничение new () позволяет компилятору знать, что любой предоставленный аргумент типа должен иметь доступный конструктор без параметров-или по умолчанию -
так и должно быть, T
должен быть классом и иметь доступный конструктор без параметров--или по умолчанию.
Что происходит после " Где " является ограничением на общий тип T, который вы объявили, так:
класс означает, что T должен быть классом, а не типом значения или ключевого слова struct.
new () указывает, что класс T должен иметь открытый конструктор по умолчанию без параметров.
Это называется "ограничением" для универсального параметра T. Это означает, что T должен быть ссылочным типом (классом) и что он должен иметь открытый конструктор по умолчанию.
Это часть механизма Generics, где ключевое слово where добавляет ограничения к тому, какие типы должны реализовываться для использования в качестве параметров типа.