1. ホーム
  2. c#

[解決済み] c# compare two generic values [duplicate] 2つの汎用的な値を比較する。

2023-08-11 10:50:16

質問

重複の可能性があります。

C#では演算子==は総称型に適用できないのですか?

こんな感じでコーディングしてみました。

public bool IsDataChanged()
{           
    T value1 = GetValue2;
    T value2 = GetValue1();

    return (valueInDB != valueFromView);
}

現在、この関数は " というエラーでコンパイルできません。 演算子 '!=' は 'T' 型と 'T' 型のオペランドに適用することができません。 というエラーが出ます。この関数を動作させるために何をしなければなりませんか?

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

一般的な型の演算子は使用できません(特殊なケースである foo == null を除く)。ただし、where T : class を追加して参照型であることを示す必要があります(そうすれば foo == bar は合法になります)。

使用方法 EqualityComparer<T> .Defaultを使用すると、あなたのためにそれを行うことができます。これは ではなく のみの演算子オーバーロードを提供する型では、どちらか一方だけでは動作しません。

  • インプリメント IEquatable<T>
  • object.Equals()をオーバーライドします。

一般に、==演算子を実装して、これらの少なくとも1つを実行しないことは、いずれにしても非常に悪い考えなので、これは問題になりそうもないでしょう。

public bool IsDataChanged<T>()
{           
    T value1 = GetValue2;
    T value2 = GetValue1();

    return !EqualityComparer<T>.Default.Equals(value1 , value2);
}

に制限しない場合は IEquatable<T> を実装していない場合、EqualityComparer のデフォルトのフォールバックは、値型と共に使用されるとボクシングを引き起こす可能性があります。 IEquatable<T> (を実装していない値型を使用した場合、箱詰めされる可能性があります(使用する型を制御している場合は、これは問題ではないかもしれません)。私は、あなたがパフォーマンスのために =! 偶発的な を避けることができます。