この (ダミー) コードには汎用メソッドがあります (IList に述語があることは承知していますが、私のコードは IList ではなく他のコレクションを使用しています。いずれにしても、これは質問とは無関係です...)
static T FindThing<T>(IList collection, int id) where T : IThing, new()
{
foreach (T thing in collection)
{
if (thing.Id == id)
return thing;
}
return null; // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead.
}
ビルドエラーが発生します
「null は値型である可能性があるため、型パラメータ 'T' に変換できません。代わりに 'default(T)' の使用を検討してください。」
このエラーを回避できますか?
ベストアンサー1
3 つのオプション:
- を返します
default
(または、default(T)
C# の古いバージョンの場合)。つまり、 が参照型 (または null 許容値型)null
の場合はを返し、の場合はなどを返します (T
0
int
'\0'
char
デフォルト値テーブル (C# リファレンス)) T
制約付きで参照型に制限して、通常通りwhere T : class
返すことに問題がない場合はnull
T
制約を使用して null 非許容値型に制限することに問題がない場合はwhere T : struct
、null
戻り値を持つメソッドから通常どおりに戻ることができます。ただし、これは null 参照を返すのではなく、null 許容値型の null 値を返すことT?
に注意してください。