В настоящее время у меня есть это (отредактировано после прочтения совета):
struct Pair<T, K> : IEqualityComparer<Pair<T, K>>
{
readonly private T _first;
readonly private K _second;
public Pair(T first, K second)
{
_first = first;
_second = second;
}
public T First { get { return _first; } }
public K Second { get { return _second; } }
#region IEqualityComparer<Pair<T,K>> Members
public bool Equals(Pair<T, K> x, Pair<T, K> y)
{
return x.GetHashCode(x) == y.GetHashCode(y);
}
public int GetHashCode(Pair<T, K> obj)
{
int hashCode = obj.First == null ? 0 : obj._first.GetHashCode();
hashCode ^= obj.Second == null ? 0 : obj._second.GetHashCode();
return hashCode;
}
#endregion
public override int GetHashCode()
{
return this.GetHashCode(this);
}
public override bool Equals(object obj)
{
return (obj != null) &&
(obj is Pair<T, K>) &&
this.Equals(this, (Pair<T, K>) obj);
}
}
Проблема в том, что First и Second не могут быть ссылочными типами (VS фактически предупреждает меня об этом), но код все еще компилируется. Должен ли я привести их (Первый и Второй) к объектам, прежде чем сравнивать их, или есть лучший способ сделать это?
Edit:
Обратите внимание, что я хочу эту структуру для поддержки значений и ссылочных типов (другими словами, ограничение по классу не является допустимым решением)
Редактировать 2:
Что касается того, чего я пытаюсь достичь, я хочу, чтобы это работало в словаре. Во-вторых, SRP не важен для меня сейчас, потому что это на самом деле не суть этой проблемы - ее всегда можно реорганизовать позже. В-третьих, сравнение со значением по умолчанию (T) не будет работать вместо сравнения со значением NULL - попробуйте.