2011-08-28 4 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(文字列)'も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>()はできません。 は.NETの参照型です。

+0

OPの最終行+1 – nawfal

5

参照型の場合は、は実際にはT型の新しいオブジェクトを返します(適切なコンストラクタがない場合は失敗します)。結果は決して同一ではありません。

2

わからないwhateあなたが求めているが、それらは異なっている:

default(T)戻り値の型ではありませんnullT場合... CreateInstanceコールは、インスタンスを作成し、存在する場合、デフォルトのコンストラクタを呼び出し(それ以外の場合は例外がスローされます)...

関連する問題