C# 关于c语言中新约束的使用#

C# 关于c语言中新约束的使用#,c#,C#,我从不使用新约束,因为我不清楚它的用法。在这里我找到了一个样本,但我不明白它的用途。这是密码 class ItemFactory<T> where T : new() { public T GetNewItem() { return new T(); } } public class ItemFactory2<T> where T : IComparable, new() { } 类ItemFactory,其中T:new()

我从不使用新约束,因为我不清楚它的用法。在这里我找到了一个样本,但我不明白它的用途。这是密码

class ItemFactory<T> where T : new()
{
    public T GetNewItem()
    {
        return new T();
    }
}

public class ItemFactory2<T> where T : IComparable, new()

{
}
类ItemFactory,其中T:new()
{
公共T GetNewItem()
{
返回新的T();
}
}
公共类ItemFactory2,其中T:IComparable,new()
{
}

因此,任何人请让我了解新约束的使用与小而简单的样本为现实世界的使用。感谢

此约束要求所使用的泛型类型是非抽象的,并且它有一个默认(无参数)构造函数,允许您调用它

工作示例:

class ItemFactory<T> where T : new()
{
    public T GetNewItem()
    {
        return new T();
    }
}
class ItemFactory<T>
{
    public T GetNewItem()
    {
        return new T(); // error here => you cannot call the constructor because you don't know if T possess such constructor
    }
}
类ItemFactory,其中T:new()
{
公共T GetNewItem()
{
返回新的T();
}
}
这显然会迫使您对作为泛型参数传递的类型使用无参数构造函数:

var factory1 = new ItemFactory<Guid>(); // OK
var factory2 = new ItemFactory<FileInfo>(); // doesn't compile because FileInfo doesn't have a default constructor
var factory3 = new ItemFactory<Stream>(); // doesn't compile because Stream is an abstract class
var factory1=new ItemFactory();//好啊
var factory2=new ItemFactory();//未编译,因为FileInfo没有默认构造函数
var factory3=new ItemFactory();//未编译,因为流是抽象类
非工作示例:

class ItemFactory<T> where T : new()
{
    public T GetNewItem()
    {
        return new T();
    }
}
class ItemFactory<T>
{
    public T GetNewItem()
    {
        return new T(); // error here => you cannot call the constructor because you don't know if T possess such constructor
    }
}
类项目工厂
{
公共T GetNewItem()
{
return new T();//error here=>您不能调用构造函数,因为您不知道T是否拥有这样的构造函数
}
}
新约束指定泛型类声明中的任何类型参数必须具有公共无参数构造函数


引用官方的

您可以阅读
new()
,就像它是一个与构造函数的接口一样。就像IComparable指定类型T具有方法CompareTo一样,新约束指定类型T具有公共构造函数。

在您的示例中,约束作用于类声明中的
。在第一种情况下,它要求泛型
T
对象具有默认(无参数)构造函数。在第二个示例中,它要求
T
应该有一个默认的无参数构造函数,并且它必须实现
IComparable
接口。

此外,类似的操作将失败,因为
Bar
没有无参数构造函数

   class ItemFactory<T> where T : new()
   {
      public T GetNewItem()
      {
         return new T();
      }
   }

   class Foo : ItemFactory<Bar>
   {

   }

   class Bar
   {
      public Bar(int a)
      {

      }
   }
类ItemFactory,其中T:new()
{
公共T GetNewItem()
{
返回新的T();
}
}
Foo类:ItemFactory
{
}
分类栏
{
公共酒吧(INTA)
{
}
}
实际错误是:
“Bar”必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法“ItemFactory”中将其用作参数“T”

以下操作也将失败:

class ItemFactory<T>
{
    public T GetNewItem()
    {
        return new T();
    }
}
类项目工厂
{
公共T GetNewItem()
{
返回新的T();
}
}

实际错误是:
无法创建变量类型“T”的实例,因为它没有new()约束

默认的ctor为空ctor;)@诺瓦科夫:不对。默认的ctor是没有参数的ctor。但它的主体不必为空,它可以很好地包含代码。@Daniel:我一直认为,如果没有定义构造函数,“default”意味着它有默认(调用基类构造函数)行为,则默认的构造函数是由编译器生成的。@Novakov:部分正确:如果您的类本身没有定义构造函数,编译器生成一个没有参数的构造函数,不执行任何操作,并调用基类的默认构造函数。没错。但是,术语“默认构造函数”是指所有(1)公共且(2)没有参数的构造函数。我只需要知道…new()将始终用于无参数构造函数。若构造函数接受参数,那个么我们就不能使用像where T:new()这样的语法?请讨论一下。谢谢