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

C# - How do generics with the new() constraint get machine code generated?

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