为什么这种颜色比较失败?

Ant*_*ony 9 c# colors

为什么这个断言失败了?

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)

这个怎么运作:

  1. value比较.它是当前实例的Argb值(它们存储在一个类型的字段中long).所以,如果Argb不同,我们会有不同的颜色.您已成功通过此步骤.
  2. state比较.它显示了如何创建颜色的方式:来自Argb,来自KnownColor或名称.实际上你的比较在这一步失败了.
  3. knownColor比较.如果不是从已知颜色创建颜色,则它具有KnownColor枚举值,或者为零.
  4. 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)

但这没有任何意义,因为您可以在程序的每个地方使用单色实例:)