1. ホーム
  2. c#

[解決済み] C#でジェネリックメソッドからNULLを返すにはどうしたらいいですか?

2022-03-16 06:32:35

質問

私はこの(ダミーの)コードでジェネリックメソッドを持っています(はい、私はIListが述語を持っていることを知っています、しかし私のコードはIListではなく他のコレクションを使っています、とにかくこれは質問には関係ありません...)

static T FindThing<T>(IList collection, int id) where T : IThing, new()
{
    foreach T thing in collecion
    {
        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)' を使用することを検討してください。

このエラーを回避することはできますか?

解決方法は?

2つの選択肢があります。

  • 戻る default(T) を返すということです。 null が参照型(または null 可能な値型)である場合。 0 に対して int , '\0' について char などなど( 既定値表(C#参考) )
  • でTが参照型であることを制限します。 where T : class という制約を設け、その上で null 通常通り