Что означает "где T: class, new ()"?



не могли бы вы объяснить мне, что where T : class, new() значит в следующей строке кода?



void Add<T>(T item) where T : class, new();
611   10  

10 ответов:

это ограничение на общий параметр T. Это должно быть class (ссылочный тип) и должен иметь открытый конструктор без параметров по умолчанию.

что означает T не может быть int,float,double,DateTime или любое другое struct (тип значения).

это может быть string, или любой другой пользовательский ссылочный тип, если он имеет конструктор по умолчанию или без параметров.

это ограничения общего типа. В вашем случае их два:

where T : class

означает, что тип T должен быть ссылочный тип (не тип значения).

where T : new()

означает, что тип T должен иметь конструктор без параметров. Наличие этого ограничения позволит вам сделать что-то вроде T field = new T(); в вашем коде, который вы не смогли бы сделать иначе.

затем вы объединяете их с помощью запятой, чтобы получить:

where T : class, new()

где T: struct

аргумент type должен быть типом значения. Можно указать любой тип значения, кроме Nullable. Дополнительные сведения см. В разделе использование типов с нулевым значением (руководство по программированию на C#).

где T : класс

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

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

где T : [имя класса]

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

где 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

аргумент type должен быть ссылочным типом; это также относится к любому классу, интерфейсу, делегату или типу массива.

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 должен быть класс и есть конструктор, который не принимает никаких аргументов.

например, вы должны быть в состоянии сделать это:

T t = new T();

где (ссылка на C#)

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

так и должно быть, T должен быть класс и иметь доступный конструктор без параметров--или по умолчанию.

Что происходит после "Где" - это ограничение на общий тип T, который вы объявили, поэтому:

  • класс означает, что T должен быть классом, а не типом значения или ключевого слова struct.

  • new () указывает, что класс T должен иметь открытый конструктор по умолчанию без параметров.

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

Это часть механизма Generics, где ключевое слово where добавляет ограничения к тому, какие типы должны быть реализованы для использования в качестве параметров типа.

Comments

    Ничего не найдено.