Using ToArgb() followed by FromArgb() does not res

2019-02-17 18:36发布

This does not work

        int blueInt = Color.Blue.ToArgb();
        Color fred = Color.FromArgb(blueInt);
        Assert.AreEqual(Color.Blue,fred);

Any suggestions?

[Edit]

I'm using NUnit and the output is

failed:

Expected: Color [Blue]

But was: Color [A=255, R=0, G=0, B=255]

[Edit]

This works!

        int blueInt = Color.Blue.ToArgb();
        Color fred = Color.FromArgb(blueInt);
        Assert.AreEqual(Color.Blue.ToArgb(),fred.ToArgb());

4条回答
甜甜的少女心
2楼-- · 2019-02-17 18:54

I would have expected this with Assert.AreSame because of the boxing with the value types, but AreEqual should not have this problem.

Could you add which language (I'm assuming C#) your using and which testing framework?

What does Assert.AreEqual(true, Color.Blue == fred); result in?

查看更多
劳资没心,怎么记你
3楼-- · 2019-02-17 19:12

From the MSDN documentation on Color.operator ==:

This method compares more than the ARGB values of the Color structures. It also does a comparison of some state flags. If you want to compare just the ARGB values of two Color structures, compare them using the ToArgb method.

I'm guessing the state flags are different.

查看更多
爱情/是我丢掉的垃圾
4楼-- · 2019-02-17 19:13

They won't equal the same, as Color.Blue doesn't equal your colour object, it equals something stored internally, a "new Color(KnownColor.Blue);" to be exact.

查看更多
Melony?
5楼-- · 2019-02-17 19:18

Alternatively, this also works, and I think it's more intuitive

    [Test]
    public void ColorTransform()
    {
        var argbInt = Color.LightCyan.ToArgb();
        Color backColor = Color.FromArgb(argbInt);
        Assert.AreEqual(Color.LightCyan.A, backColor.A);
        Assert.AreEqual(Color.LightCyan.B, backColor.B);
        Assert.AreEqual(Color.LightCyan.G, backColor.G);
        Assert.AreEqual(Color.LightCyan.R, backColor.R);
    }
查看更多
登录 后发表回答