我定义了一个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()。很明显,我从错误的角度入手了。有人能给我一些见解吗?
另外一件事情是,我不能在这里使用结构体(值类型),因为在我的实际情况中,我是在一个基类中定义所有这些内容并从中继承的。