下面泛型約束代碼,where字句后面有new()約束,T類型必須有公有的無參的構造函數。
private T InternalCreate<T>() where T : IObjectWithGuid, new() { T result = new T(); //不同於非泛型中的new result.Guid = Guid.NewGuid().ToString(); return result; }
使用new關鍵字的作用只是讓編譯器在泛型實例化之處,檢查所綁定的泛型參數T是否具有公共無參構造函數(public 無參構造函數),例如:InternalCreate<SomeType>(); //此處編譯器會檢查SomeType是否具有無參構造函數。若沒有則會有compile error。
上面的代碼等同於下面代碼:
private T InternalCreate<T>() where T : IObjectWithGuid, new() { T result = System.Activator.CreateInstance<T>(); result.Guid = Guid.NewGuid().ToString(); return result; }