gpt4 book ai didi

c# - 如果类型 T 需要实例化,为什么通用类签名需要指定 new() ?

转载 作者:可可西里 更新时间:2023-11-01 08:00:57 26 4
gpt4 key购买 nike

我正在编写一个通用类,如下所示。

public class Foo<T> : 
where T : Bar, new()
{
public void MethodInFoo()
{
T _t = new T();
}
}

如您所见,类型 T 的对象 _t 是在运行时实例化的。为了支持泛型类型 T 的实例化,该语言强制我将 new() 放在类签名中。如果 Bar 是一个抽象类,我会同意这一点,但如果 Bar 是具有公共(public)无参数构造函数的标准非抽象类,为什么需要这样。

如果没有找到 new(),编译器会提示以下消息。

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

最佳答案

因为通常没有假设模板参数需要[非抽象且]可构造[通过公共(public)无参数构造函数]才能使 Type 匹配模板参数定义。

直到您在模板上添加 :new() 约束:

  • 编译器不会让你构造一个T
  • 编译器会让你将 T 与抽象类型或没有公共(public)无参数构造函数的类型匹配

:Bar 位是正交的,意味着:

  • 不要让人们匹配不是从[或] Bar
  • 派生的类型
  • 让我在体内将 T 转换为 Bar 或从 Bar 派生的类型
  • 让我在 T 上调用 Bar 的公共(public)和范围内的内部方法

关于c# - 如果类型 T 需要实例化,为什么通用类签名需要指定 new() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1839734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com