1. ホーム
  2. c#

[解決済み】C#のジェネリック引数のNullまたはデフォルト比較

2022-03-27 23:39:47

質問

以下のようなジェネリックメソッドが定義されています。

public void MyMethod<T>(T myArgument)

まず最初に、myArgumentの値がその型のデフォルト値であるかどうかをチェックしたいのですが、こんな感じです。

if (myArgument == default(T))

しかし、これではコンパイルできない。なぜなら、Tが==演算子を実装することを保証していないからだ。 そこで、コードを次のように変更した。

if (myArgument.Equals(default(T)))

さて、これはコンパイルできますが、myArgumentがnullの場合は失敗します。これは私がテストしていることの一部です。 このように明示的なNULLチェックを追加することができます。

if (myArgument == null || myArgument.Equals(default(T)))

さて、これは私には冗長に感じられます。 ReSharperは、myArgument == nullの部分をmyArgument == default(T)に変えろと言っているくらいですから、私が始めたところです。 この問題を解決する良い方法はないでしょうか?

をサポートする必要があります。 ともに 参照型と値型があります。

どのように解決するのですか?

箱詰めを避けるために、ジェネリックの等価性を比較する最良の方法は EqualityComparer<T>.Default . これは IEquatable<T> (ボックス化なし)だけでなく object.Equals を処理し、すべての Nullable<T> "lifting"のようなニュアンスです。したがって

if(EqualityComparer<T>.Default.Equals(obj, default(T))) {
    return obj;
}

これがマッチングします。

  • クラスの場合は null
  • にはヌル(空)。 Nullable<T>
  • その他の構造体については、0/false/など。