C# のジェネリック メソッドから NULL を返すにはどうすればよいでしょうか? 質問する

C# のジェネリック メソッドから NULL を返すにはどうすればよいでしょうか? 質問する

この (ダミー) コードには汎用メソッドがあります (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の場合はを返し、の場合はなどを返します (T0int'\0'charデフォルト値テーブル (C# リファレンス)
  • T制約付きで参照型に制限して、通常通りwhere T : class返すことに問題がない場合はnull
  • T制約を使用して null 非許容値型に制限することに問題がない場合はwhere T : structnull戻り値を持つメソッドから通常どおりに戻ることができます。ただし、これは null 参照を返すのではなく、null 許容値型の null 値を返すことT?に注意してください。

おすすめ記事