System.Drawing.Color相等运算符不会将0xffffffff视为Color.White

Shi*_*mmy 5 .net system.drawing colors system.drawing.color

为什么要评估false

Color.FromArgb(255, 255, 255, 255) == Color.White
Run Code Online (Sandbox Code Playgroud)

更新它的设计.

这是结构中反编译Equals函数的副本Color:

public override bool Equals(object obj)
{
    //probably failure to convert from C++ source,
    //the following line should be invalid in C#, nevermind
    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(this.name)));
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么MSFT让我比较白色丑陋的方式?!?!?

static bool AreEqual(Color a, Color b)
{
  if (!a.Equals(b))
  {
    return
      a.A == b.A &&
      a.R == b.R &&
      a.G == b.G &&
      a.B == b.B;    
  }
  return true;
}
Run Code Online (Sandbox Code Playgroud)

另外,另一件事我不明白为什么FromArgb函数的1-arg重载Color需要一个int,它应该能够采取a uint(0xffffffff)

Mus*_*sis 6

这就是.NET中的颜色如何工作:

此结构仅与其他Color结构进行比较.要仅根据其ARGB值比较颜色,您应该执行以下操作:

if(color1.ToArgb()== color2.ToArgb())...

这是因为.Equals和==运算符使用的不仅仅是颜色的ARGB值来确定等效性.例如,Color.Black和Color.FromArgb(0,0,0)不被认为是相等的,因为Color.Black是命名颜色而Color.FromArgb(0,0,0)不是.

编辑:其他答案.

我的问题是,为什么MSFT让我比较白色丑陋的方式?!?!?

如果您要以这样的方式比较颜色,以便知道它们是否与ARGB组件的值完全相同,那么您应该以"丑陋"的方式比较它们.如果你比较在大多数.NET程序员使用的相同方式的颜色Color结构,那么你只需要知道一些颜色WhiteRed或者Chartreuse,和"漂亮"的方式(使用Equals和==)操作简单,容易使用,非常可读.

此外,"丑陋"的方式不是你发布的方法,它是这样的:

if (color1.ToArgb() == color2.ToArgb()) ...
Run Code Online (Sandbox Code Playgroud)

这不是那么难看.

另外,另一件事我不明白为什么Color的1-arg构造函数需要一个int,它应该能够取一个uint(0xffffffff)

我会说,它应该能够采取一个uint,这要归功于将导致不可避免的混乱和色彩误差.编写一个方法来执行此操作很容易.