比較のあり方につ要素の同一であるが、自由闊達な汎用タイプ等?[重複]
質問
可能な重複:
できないオペレーター==適用される汎用型C#?
私には、以下の一般クラスのコンパイラの警告を発する"Operator '!=' cannot be applied to operands of type 'TValue' and 'TValue'
"参照 CS0019):
public class Example<TValue>
{
private TValue _value;
public TValue Value
{
get { return _value; }
set
{
if (_value != value) // <<-- ERROR
{
_value= value;
OnPropertyChanged("Value");
}
}
}
}
がん抑制 TValue
へ class
, う Object.Equals()
.ていることをboths構造体および授業にいるようであれば、すごく嬉しいかなるものです。
その質問は、どのように私の二つの要素を同一であるが、自由闊達な汎用タイプ等?
解決
このようなことを試しましたか?
public class Example<TValue>
{
private TValue _value;
public TValue Value
{
get { return _value; }
set
{
if (!object.Equals(_value, value))
{
_value = value;
OnPropertyChanged("Value");
}
}
}
}
他のヒント
三つのオプション:
- 制TValueの実施
IEquatable<TValue>
を呼び出x.Equals(y)
- 他のパラメータの型
IEqualityComparer<TValue>
その - 使用
EqualityComparer<TValue>.Default
行の比較
まず、オプション2と3コース-デフォルトのデフォルトのcomparerですが、特定の一つです。
- 値型のEquals()
- 参照型のReferenceEquals()
IComparableはオプションですか?
public class Example<TValue> where TValue: IComparable
{
private TValue _value;
public TValue Value
{
get { return _value; }
set
{
if (_value.CompareTo(value) != 0)
{
_value = value;
OnPropertyChanged("Value");
}
}
}
}
!=
演算子は使用できない場合があるため、ここに適用できないと思います。たとえば、比較演算子(==
int != int
)がオーバーロードされていない限り、<=>を構造体の比較に使用することはできません。
もちろん、<=>などの言語構造体を比較できますが、これがどのように実装されているのかわかりません。
したがって、TValueは custom 構造体になる可能性があるため、<=>演算子を使用できません。
public static bool operator ==(EntityBase<T> entity1, EntityBase<T> entity2)
{
if ((object)entity1 == null && (object)entity2 == null)
{
return true;
}
if ((object)entity1 == null || (object)entity2 == null)
{
return false;
}
if (Comparer<T>.Default.Compare(entity1.Id, entity2.Id) != 0)
{
return false;
}
return true;
}
所属していません StackOverflow