文字列メンバーを持つ C# クラスを定義しました。すべての目的のために、このクラスは string のサブクラスであると考えてください (ただし、許可されていません)。特定の形式に一致する厳密に型指定された文字列フィールドを表すために使用しています (これを大幅に簡略化しました)。
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;
}
}
ここで、このクラスを他の文字列 (オブジェクトまたはリテラル) と直接比較できるようにしたいと考えています。したがって、クラスに次のように実装しました。
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);
}
単体テストを作成しているときに、Assert.AreEqual に引数を渡す順序に応じて、異なる結果が得られます。
string valid = "Some String";
field target = new field(valid);
Assert.AreEqual(target, valid); // PASSES
Assert.AreEqual(valid, target); // FAILS
これは、最初のアサートで field.Equals() を呼び出しており、2 番目のアサートで String.Equals() を呼び出しているためだと思います。明らかに、私はこれに間違った角度からアプローチしています。誰でも私に洞察を与えることができますか?
もう1つ。ここで構造体 (値型) を使用することはできません。実際のケースでは、これらすべてを基本クラスで定義し、そこから継承しているためです。