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
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