2011-08-28 94 views
8

我想知道下面的语句是否曾经为参考类型返回不同的结果,还是它们是相同的?默认(T)与Activator.CreateInstance(T)

  1. default(T)
  2. Activator.CreateInstance(T)

如果它们是相同的,可以总是使用默认值(T),在此实例中,如果目的是要输出的T?:

的默认值
if (typeof(T).IsValueType || typeof(T) == typeof(String)) 
{ 
    return default(T); 
} 
else 
{ 
    return Activator.CreateInstance<T>(); 
} 

Best way to test if a generic type is a string? (c#)

TA!

+2

不,引用类型的默认值(T)返回null,CreateInstance()不会产生,因为它创建了一个类型为T的对象。很难猜测这段代码真的尝试了什么做。 –

+2

也不是'default(string)'null吗? – BoltClock

+0

谢谢你澄清混淆!代码示例是混淆的一部分,我在它下面链接的stackoverflow帖子中看到它。 – Cel

回答

14

它们完全不同。

  1. default(T),当T是引用类型,永远是null
  2. Activator.CreateInstance<T>()将使用默认构造函数创建该类型的新实例(如果存在),否则将引发MissingMethodException
3

T是引用类型时,它们将始终返回不同的结果。 default(T)将返回null,而Activator.CreateInstance<T>()将返回使用T的公共无参数构造函数创建的T的新实例。

+3

或者,如果它找不到这样的构造函数,则抛出异常。 – BoltClock

+0

当然。这是一个例外,它根本不会返回任何东西。 – cdhowie

2

default(T)将返回null作为参考类型。 Activator.CreateInstance<T>()不会。 A string是.NET中的一个引用类型。

+0

+1为OP的最后一行 – nawfal

5

对于引用类型,default(T)将为空,而CreateInstance实际上会返回一个T类型的新对象(或者如果没有合适的构造函数会失败),因此结果永远不会相同。

2

不知道whate你是问,但它们是不同的:

default(T)返回null如果T是不是值类型...的CreateInstance调用创建一个实例,如果有一个调用默认的构造函数(否则抛出异常)...

相关问题