为什么这个断言会失败?
Assert.AreEqual( Color.Red, Color.FromArgb( Color.Red.A, Color.Red.R, Color.Red.G, Color.Red.B ) );
最佳答案
以下是颜色比较的实现方式:
public override bool Equals(object obj)
{
if (obj is Color)
{
Color color = (Color) obj;
if ((this.value == color.value)
&& (this.state == color.state)
&& (this.knownColor == color.knownColor))
{
return ((this.name == color.name)
|| ((this.name != null)
&& (color.name != null)
&& this.name.Equals(color.name)));
}
}
return false;
}
工作原理:
- 字段
value
比较。它是当前实例的 Argb 值(它们存储在long
类型的一个字段中)。所以,如果 Argb 不同,我们就有不同的颜色。您成功通过了这一步。 - 字段
state
比较。它显示了颜色的创建方式:来自 Argb、来自 KnownColor 或按名称。 实际上你的比较在这一步失败了。 - 字段
knownColor
比较。它具有 KnownColor 枚举值,如果颜色不是从已知颜色创建的,则为零。 - 字段
name
比较。它对所有颜色都有null
值,但按名称创建的颜色除外。
所以,如果你想比较颜色的值,你应该使用 value
字段进行比较(它由 ToArgb 方法返回):
Assert.AreEqual(color1.ToArgb(), color2.ToArgb());
编辑
要创建某些颜色的副本,您可以使用以下扩展方法:
public static class ColorHelper
{
public static Color Copy(this Color color)
{
if (color.IsKnownColor)
return Color.FromKnownColor(color.ToKnownColor());
if (color.IsNamedColor)
return Color.FromName(color.Name);
// this is better, then pass A,r,g,b separately
return Color.FromArgb(color.ToArgb());
}
现在断言通过了:
Assert.AreEqual(Color.Red, Color.Red.Copy());
但这没有任何意义,因为您可以在程序的每个地方使用单一颜色实例:)
关于c# - 为什么这个颜色比较失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9994019/