masz kilka opcji tutaj
Pierwszym jest użycie Object.Equals
:
if(b.Equals(iteratorB)) {
// do stuff
}
Bądź ostrożny używając tej opcji; jeśli B
nie zastępuje Object.Equals
, wówczas domyślne porównanie jest równością odniesienia, gdy B
jest typem odniesienia i równością wartości, gdy B
jest typem wartości. To może nie być zachowanie, którego szukasz i dlatego bez dodatkowych informacji rozważałbym jedną z dwóch następnych opcji.
Drugi jest dodać ograniczenie, które B
jest IComparable
:
public class WidgetBox<A, B, C> where B : IComparable
tak że
if(b.CompareTo(iteratorB) == 0) {
// do stuff
}
Trzeci jest wymaga IEqualityComparer<B>
przekazywane do konstruktora WidgetBox
public class WidgetBox<A, B, C> {
IEqualityComparer<B> _comparer;
public WidgetBox(IEqualityComparer<B> comparer) {
_comparer = comparer;
}
// details elided
}
Następnie:
if(_comparer.Equals(b, iteratorB)) {
// do stuff
}
Dzięki tej ostatniej opcji można podać przeciążenie, które domyślnie EqualityComparer<T>.Default
:
public WidgetBox() : this(EqualityComparer<T>.Default) { }
możliwy duplikat [Can not operator == być zastosowane do typów ogólnych w języku C#? (http://stackoverflow.com/questions/390900/cant-operator-be-applied-to-generic-types-in-c) – nawfal