重载 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 a
和 Outer 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();
}
我有一个 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 a
和 Outer 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();
}