重载 ToString() 是否会阻止数值之间的隐式比较?

Does overloading ToString() prevent implicit comparison between numeric values?

我有一个 Outer class,其中包含一个名为 Value 的小数字段。它表示介于 0 和 1(含)之间的值,并包含一个逻辑 NOT ! 运算符,该运算符从 1.

中减去其值
public class Outer : IEquatable<decimal> {
    public decimal Value;

    public Outer(decimal val = 0.5m) => Value = val;

    public override string ToString() => $"Value: {Value}";
    public bool Equals(Outer o) => this.Value == o.Value;

    public static implicit operator decimal(Outer o) => o.Value;
    public static implicit operator Outer(decimal d) => new Outer(d);

    public static Outer operator !(Outer o) => new Outer(1m - Value);
}

我正在尝试使用 Value 字段比较 Outer aOuter b 之间的相等性(隐含地)。如果我用 0.75m 初始化 a!a 应该等于 0.25m.

public class TESTING_Outer {
    [NUnit.Framework.Test]
    public void Not_Operator_Negates_Value() {
        Outer a = 0.75m, b = 0.25m;

        Assert.AreEqual(0.25m, !a);      // works with direct value
        Assert.AreEqual(b, (decimal)!a); // works with explicit cast

        Assert.AreEqual(b, !a);          // fails with implicit cast
    }
}

如评论所述,当尝试检查两个 Outer 实例是否相等时,尽管它们具有相同的值,但此测试失败。

我收到以下错误输出消息:

Not_Operator_Negates_Value (0.045s)
---
  Expected: <Value: 0.25>
   But was: <Value: 0.25>
---

为什么最后一个 Assert 失败,我如何确保我的对象正确地比较它们的值?

实际上我在编写其余代码时偶然发现了我的错误。原来我只是忘记了几个重载。

感谢所有对我的问题发表评论的人。你们都很快指出我遗漏了什么! :)

public class Outer : IEquatable<decimal> {
    public decimal Value;

    public Outer(decimal val = 0.5m) => Value = val;

    public override string ToString() => $"Value: {Value}";
    public bool Equals(Outer o) => this.Value == o.Value;

    public static implicit operator decimal(Outer o) => o.Value;
    public static implicit operator Outer(decimal d) => new Outer(d);

    public static Outer operator !(Outer o) => new Outer(1m - Value);

    // What I needed to add:
    public override bool Equals(object obj) =>
        obj as Outer == null ? false : (obj as Outer).Value == Value;
    public override int GetHashCode() => Value.GetHashCode();
}