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/