C# - 具有 new() 约束的泛型如何生成机器码?

标签 c# generics clr

public T Foo<T, U>(U thing) where T : new()
{
    return new T();
}

当没有 new() 约束时,我明白它是如何工作的。 JIT 编译器看到 T,如果它是引用类型,则使用代码的对象版本,并专门针对每个值类型的情况。

如果你有一个新的 T() 在那里它是如何工作的?它在哪里寻找?

最佳答案

如果您的意思是,IL 是什么样子,编译器将在对 Activator.CreateInstance<T> 的调用中进行编译。 .

您传递的类型为 T必须有一个公共(public)的无参数构造函数来满足编译器。

您可以在 Try Roslyn 中对此进行测试:

public static T Test<T>() where T : class, new()
{
    return new T();
}

变成:

.method public hidebysig static 
    !!T Test<class .ctor T> () cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 6 (0x6)
    .maxstack 8

    IL_0000: call !!0 [mscorlib]System.Activator::CreateInstance<!!T>()
    IL_0005: ret
} // end of method C::Test

关于C# - 具有 new() 约束的泛型如何生成机器码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32553449/

相关文章:

c# - 通用接口(interface)类型

c# - 调用 Assembly.Load(byte[]) 可以引发 AppDomain.AssemblyResolve 事件吗?

windows - 缺少 .NET CLR 性能计数器

c# - WPF查找窗口实例

c# - 从 C# 调用 C++ 库

c# - 将 MailItem 转换为内存中的 MSG,而不是文件系统中的 MSG

c# - 隐式和显式委托(delegate)创建之间的区别(有和没有泛型)

c - 访问另一个结构中的结构字段

c# - 按钮在 Html 表格中不可见?

c# - 在 .Net 中,许多静态类是线程安全的,这是如何实现的?