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

时间:2011-01-19 16:37:42

标签: c# generics type-constraints

您可以向我解释一下where T : class, new()在以下代码行中的含义吗?

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

11 个答案:

答案 0 :(得分:283)

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

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

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

答案 1 :(得分:139)

这些是泛型类型约束。在你的情况下,有两个:

where T : class

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

where T : new()

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

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

where T : class, new()

答案 2 :(得分:106)

其中T:struct

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

其中T:class

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

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

其中T:[基类名称]

type参数必须是或来自指定的基类。

其中T:[界面名称]

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

其中T:U

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

答案 3 :(得分:16)

class&amp; new为2 constraints on the generic type parameter T 他们分别确保:

class

  

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

new

  

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
}

答案 4 :(得分:13)

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();
        }
    }

答案 5 :(得分:6)

这意味着类型T必须是类,而具有不带任何参数的构造函数。

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

T t = new T();

答案 6 :(得分:5)

where (C# Reference)

  

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

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

答案 7 :(得分:3)

&#34; Where&#34;是对您声明的泛型类型T的约束,因此:

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

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

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

答案 10 :(得分:0)

在约束中使用 class 时,意味着您只能使用引用类型,要添加的另一件事是何时使用约束 new(),它必须是您在“约束条件”条款中写的最后一句话。