C# S:new()在c中的位置是什么意思#

C# S:new()在c中的位置是什么意思#,c#,generics,C#,Generics,在下面的代码中,我不知道“where S:new()”部分是什么意思。在Google中查找更多信息的关键字是什么 public virtual void Print<S, T>() where S : new() { Console.WriteLine(default(T)); Console.WriteLine(default(S)); } public虚拟作废打印() 其中S:new() {

在下面的代码中,我不知道“where S:new()”部分是什么意思。在Google中查找更多信息的关键字是什么

    public virtual void Print<S, T>() 
        where S : new() 
    { 
        Console.WriteLine(default(T)); 
        Console.WriteLine(default(S)); 
    } 
public虚拟作废打印()
其中S:new()
{ 
Console.WriteLine(默认值(T));
Console.WriteLine(默认值);
} 
约束
new()
意味着特定的泛型参数需要有一个默认构造函数(即没有参数的构造函数)

这样做的目的通常是允许您安全地键入并构造泛型参数类型的新实例,而无需求助于reflection/Activator.CreateInstance

例如:

public T Create<T>() where T : new()
{
    // allowed because of the new() constraint
    return new T();
}
public T Create(),其中T:new()
{
//由于new()约束而被允许
返回新的T();
}
有关更多信息,请查看


至于谷歌搜索词,我会尝试“c#new()约束”

搜索类型参数上的约束。这是我通过搜索找到的重复链接。另外,这也显示在相关问题侧栏中。正式名称是构造函数约束,所以你也可以用谷歌搜索。当然,约束是最重要的词。请注意,如果
T
恰好是值类型,则
new T()不调用实际实例构造函数;对于值类型,它构造的值与默认值(T)
相同。因此,不允许组合值类型约束和构造函数约束,因此这是非法的:
其中T:struct,new()
(视为冗余)。如果
T
是引用类型,
default(T)
提供
null
引用,而
new T()调用实构造函数。任何值类型,包括预定义的整数类型和枚举类型,都满足构造函数约束。引用类型满足它当且仅当它(是非抽象的,并且)有一个
public
零参数实例构造函数。(抽象类不应具有
public
构造函数。)