以為 where T : new() 讓 new T() 與非泛型 new Object() 完全等價。實際上:
Tester<SomeType> t = new Tester<SomeType>();
編譯器於此處檢查 SomeType 是否具備公用無參數建構函式。若無,直接報錯 CS0310。
public class Tester<T> where T : new()
{
public Tester()
{
// 等價於:
t = System.Activator.CreateInstance<T>();
}
private T t;
}
new T() 在 IL 層級編譯為 Activator.CreateInstance<T>() 呼叫,非直接 newobj 指令。因此:
new 略低(反射開銷)。T 為實質型別,仍正常運作(CLR 特殊處理)。new T(),改用委派工廠 Func<T> 注入。