私は任意の型、プリミティブなどを許可する汎用クラスを持っています。これの唯一の問題はdefault(T)
を使用していることです。値型または文字列でdefaultを呼び出すと、それは妥当な値(空の文字列など)に初期化されます。オブジェクトに対してdefault(T)
を呼び出すと、nullが返されます。いろいろな理由から、プリミティブ型でない場合は、ではないの型のデフォルトインスタンスが存在することを保証する必要があります。ここでの試み1:ジェネリック型が文字列かどうかをテストする最良の方法? (C#)
T createDefault()
{
if(typeof(T).IsValueType)
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
問題 - 文字列が値型ではありませんが、パラメータなしのコンストラクタを持っていません。したがって、現在の解決策は次のとおりです。
T createDefault()
{
if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
しかし、これはクルージュのように感じます。文字列の場合を処理するためのより良い方法はありますか?
私は以前その解決策を試したと思ったし、それが動作しませんでした、しかし、私は何か愚かなことをしたに違いない。そして、デフォルト(文字列)がnullを返すことを指摘してくれてありがとうございました。私たちはそれによってまだエラーに陥っていませんでしたが、それは本当です。 –
@Matt Hamilton:+1ですが、メソッドの戻り値の型が汎用的であるため、CodeInChaosが提案したように '(T)(object)String.Empty'を返すように答えを更新する必要があります。 – VoodooChild
'is'キーワードはどうですか?ここで使うのではないですか? –