首页 文章

“T:class,new()”的意思是什么?

提问于
浏览
235

你能否告诉我 where T : class, new() 在以下代码行中的含义是什么?

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

10 回答

  • 3

    这是对泛型参数 T 的约束 . 它必须是 class (引用类型),并且必须具有公共参数的默认构造函数 .

    这意味着 T 不能是 intfloatdoubleDateTime 或任何其他 struct (值类型) .

    它可以是 string 或任何其他自定义引用类型,只要它具有默认或无参数构造函数即可 .

  • 10

    这些是通用类型约束 . 在你的情况下,有两个:

    where T : class
    

    表示类型 T 必须是引用类型(不是值类型) .

    where T : new()
    

    表示类型 T 必须具有无参数构造函数 . 拥有此约束将允许您在代码中执行类似 T field = new T(); 的操作,否则您将无法执行此操作 .

    然后使用逗号将两者结合起来:

    where T : class, new()
    
  • 1

    where T : struct

    type参数必须是值类型 . 可以指定除Nullable之外的任何值类型 . 有关详细信息,请参阅使用可空类型(C#编程指南) .

    where T : class

    type参数必须是引用类型,包括任何类,接口,委托或数组类型 . (见下面的注释 . )

    where T : new() 类型参数必须具有公共无参数构造函数 . 与其他约束一起使用时,必须最后指定new()约束 .

    where T : [base class name]

    type参数必须是或从指定的基类派生 .

    where T : [interface name]

    type参数必须是或实现指定的接口 . 可以指定多个接口约束 . 约束接口也可以是通用的 .

    where T : U

    为T提供的类型参数必须是或者从为U提供的参数派生 . 这称为裸类型约束 .

  • 1

    new(): 指定new()约束意味着类型T必须使用无参数构造函数,因此可以从中实例化对象 - 请参阅Default constructors

    class: 表示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();
            }
        }
    
  • 12

    classnew 是2 constraints on the generic type parameter T .
    他们分别确保:

    type参数必须是引用类型;这也适用于任何类,接口,委托或数组类型 .

    type参数必须具有公共无参数构造函数 . 与其他约束一起使用时,必须最后指定new()约束 .

    它们的组合意味着类型 T 必须是Reference Type(不能是Value Type),并且必须具有无参数构造函数 .

    例:

    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
    }
    
  • 97

    这意味着类型 T 必须是一个类,并且具有不带任何参数的构造函数 .

    例如,您必须能够这样做:

    T t = new T();
    
  • 6

    where (C# Reference)

    new()Constraint让编译器知道提供的任何类型参数必须具有可访问的无参数 - 或默认构造函数

    所以应该是, T 必须是一个类,并且具有可访问的无参数 - 或默认构造函数 .

  • 4

    “Where”之后的内容是对您声明的泛型类型T的约束,因此:

    • class 表示T应该是一个类,而不是值类型或结构 .

    • new() 表示T类应该定义一个无公共参数的默认构造函数 .

  • 262

    它在泛型参数T上称为“约束” . 这意味着T必须是引用类型(类)并且必须具有公共默认构造函数 .

  • 127

    这是泛型机制的一部分,其中where关键字为必须实现的类型添加约束以便用作类型参数 .

相关问题