Ich habe eine C# -Klasse mit einem Zeichenfolgenelement definiert. Für alle Absichten ein Zweck, denke an diese Klasse als eine Unterklasse von String (außer das ist nicht erlaubt). Ich benutze es, um ein stark typisiertes Zeichenkettenfeld darzustellen, das einem bestimmten Format entspricht (ich habe es erheblich vereinfacht).Überschreiben Entspricht und vergleicht mit Zeichenfolge
public class field
{
private readonly string m_field;
public field(string init_value)
{
//Check the syntax for errors
if (CheckSyntax(init_value))
{
m_field = init_value;
}
else
{
throw new ArgumentOutOfRangeException();
}
}
public override string ToString()
{
return m_field;
}
}
Nun, ich mag diese Klasse kann auf jede beliebige andere Zeichenfolge (Objekt oder wörtliche) direkt miteinander vergleichen. Deshalb habe ich die folgenden in der Klasse implementiert:
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
return this.m_field == obj.ToString();
}
public override int GetHashCode()
{
return this.m_field.GetHashCode();
}
public static bool operator ==(field x, Object y)
{
if ((object)x == null && y == null)
{
return true;
}
else if ((object)x == null || y == null)
{
return false;
}
else
{
return (x.m_field == y.ToString());
}
}
public static bool operator !=(field x, Object y)
{
return !(x == y);
}
Nun, wenn ich einen Komponententest ich schreibe, abhängig von der Reihenfolge, die ich in den Argumenten zu Assert.AreEqual bin vorbei, erhalte ich unterschiedliche Ergebnisse:
Ich nehme an, dies liegt daran, in der ersten Assert, ruft es field.Equals() und in der zweiten ruft es String.Equals(). Offensichtlich nähere ich mich dem aus dem falschen Winkel. Kann mir jemand einen Einblick geben?
Eine andere Sache. Ich kann hier keine Struktur (Werttyp) verwenden, da ich das in meinem tatsächlichen Fall in einer Basisklasse definiere und davon erben.
+1 - sehr klar, danke! –