我想知道以下陈述是否会为参考类型返回不同的结果,或者它们是否相同?
default(T)
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!
答案 0 :(得分:16)
他们完全不同。
default(T)
,当T
是参考类型时,始终为null
。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
调用创建实例并调用默认构造函数(如果有)抛出异常)...