默认(T)与Activator.CreateInstance(T)

时间:2011-08-28 17:53:19

标签: c# generics

我想知道以下陈述是否会为参考类型返回不同的结果,或者它们是否相同?

  1. default(T)
  2. Activator.CreateInstance(T)
  3. 如果它们相同,你是否总能使用默认值(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!

5 个答案:

答案 0 :(得分:16)

他们完全不同。

  1. default(T),当T是参考类型时,始终为null
  2. Activator.CreateInstance<T>()将使用默认构造函数(如果存在)创建该类型的新实例,否则抛出MissingMethodException

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

不确定你问的是,但他们是不同的:

如果default(T)不是值类型,则

null返回T ... CreateInstance调用创建实例并调用默认构造函数(如果有)抛出异常)...