2010-03-15 95 views

回答

21

您可以添加: new()约束:

void Foo<T>() where T : class, new() { 
    T newT = new T(); 
    // do something shiny with newT 
} 

如果没有约束,那么Activator.CreateInstance<T>可以帮助(减去编译时检查):

void Foo<T>() { 
    T newT = Activator.CreateInstance<T>(); 
    // do something shiny with newT 
} 

如果你的意思你的类型本身,然后可能类似于:

Type itemType = typeof(int); 
IList list = (IList)Activator.CreateInstance(
     typeof(List<>).MakeGenericType(itemType)); 
+1

+1可能有趣的是,两个代码示例在执行时都执行相同的操作(即使用Activator类)。你确实要求编译时检查,但你可能想更多地解释你的意思。 – 2010-03-15 05:33:27

+0

@Andrew Hare:有趣的一点!如果生成特定类型的Foo 代码,我会假设T newT = new T()。 – Jimmy 2010-03-15 05:45:25

+2

要跟踪安德鲁的观点; ':new()'约束允许调用代码在您点击“构建”时进行理智检查,但实际上它归结为相同的IL(用于各种实现细节)。如果没有它,它会正常工作,但是如果你打电话给'Foo ',那么就会有痛苦。 – 2010-03-15 06:15:07

相关问题