Я определил класс C # со строковым членом. Для всех целей, думайте об этом классе как о подклассе строки (за исключением того, что это не разрешено). Я использую его для представления строго типизированного строкового поля, соответствующего определенному формату (я значительно упростил это).
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 (), а во втором - String.Equals (). Очевидно, я подхожу к этому с неправильной точки зрения. Кто-нибудь может дать мне некоторое представление?
Еще одна вещь. Я не могу использовать структуру здесь (тип значения), потому что в моем случае я определяю все это в базовом классе и наследую от него.