为什么这个断言失败了?
Assert.AreEqual( Color.Red, Color.FromArgb( Color.Red.A, Color.Red.R, Color.Red.G, Color.Red.B ) );
Run Code Online (Sandbox Code Playgroud)
Ser*_*kiy 11
以下是颜色比较的实现方式:
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;
}
Run Code Online (Sandbox Code Playgroud)
这个怎么运作:
value
比较.它是当前实例的Argb值(它们存储在一个类型的字段中long
).所以,如果Argb不同,我们会有不同的颜色.您已成功通过此步骤.state
比较.它显示了如何创建颜色的方式:来自Argb,来自KnownColor或名称.实际上你的比较在这一步失败了.knownColor
比较.如果不是从已知颜色创建颜色,则它具有KnownColor枚举值,或者为零.name
比较.null
除了按名称创建的颜色外,它具有所有颜色的值.因此,如果要比较颜色值,则应使用value
比较字段(由ToArgb方法返回):
Assert.AreEqual(color1.ToArgb(), color2.ToArgb());
Run Code Online (Sandbox Code Playgroud)
编辑
要创建某种颜色的副本,您可以使用以下扩展方法:
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());
}
Run Code Online (Sandbox Code Playgroud)
现在断言传递:
Assert.AreEqual(Color.Red, Color.Red.Copy());
Run Code Online (Sandbox Code Playgroud)
但这没有任何意义,因为您可以在程序的每个地方使用单色实例:)