From 46cc341a216c2094df8e94b7c3079acd75370cf9 Mon Sep 17 00:00:00 2001 From: Gerald Versluis Date: Tue, 23 Jun 2026 10:47:50 +0200 Subject: [PATCH] Fix Color equality for derived types Keep Color as a class while preserving the immutability metadata, and align hash codes with byte-precision equality so derived Color values compare correctly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/Graphics/src/Graphics/Color.cs | 13 ++---------- .../tests/Graphics.Tests/ColorUnitTests.cs | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/Graphics/src/Graphics/Color.cs b/src/Graphics/src/Graphics/Color.cs index 7a0320334f80..d08e2aef3847 100644 --- a/src/Graphics/src/Graphics/Color.cs +++ b/src/Graphics/src/Graphics/Color.cs @@ -12,6 +12,7 @@ namespace Microsoft.Maui.Graphics /// [DebuggerDisplay("Red={Red}, Green={Green}, Blue={Blue}, Alpha={Alpha}")] [TypeConverter(typeof(Converters.ColorTypeConverter))] + [ImmutableObject(true)] public class Color { /// @@ -112,17 +113,7 @@ public override string ToString() return $"[Color: Red={r}, Green={g}, Blue={b}, Alpha={a}]"; } - public override int GetHashCode() - { - unchecked - { - int hashcode = Red.GetHashCode(); - hashcode = (hashcode * 397) ^ Green.GetHashCode(); - hashcode = (hashcode * 397) ^ Blue.GetHashCode(); - hashcode = (hashcode * 397) ^ Alpha.GetHashCode(); - return hashcode; - } - } + public override int GetHashCode() => ToInt(); public override bool Equals(object obj) { diff --git a/src/Graphics/tests/Graphics.Tests/ColorUnitTests.cs b/src/Graphics/tests/Graphics.Tests/ColorUnitTests.cs index edaba8d32657..7644347bc167 100644 --- a/src/Graphics/tests/Graphics.Tests/ColorUnitTests.cs +++ b/src/Graphics/tests/Graphics.Tests/ColorUnitTests.cs @@ -9,6 +9,14 @@ namespace Microsoft.Maui.Graphics.Tests { public class ColorUnitTests { + sealed class DerivedColor : Color + { + public DerivedColor(float red, float green, float blue, float alpha) + : base(red, green, blue, alpha) + { + } + } + [Fact] public void TestHSLPostSetEquality() { @@ -138,6 +146,19 @@ public void TestHashCode() Assert.True(color1.GetHashCode() == color2.GetHashCode()); } + [Fact] + public void EqualsDerivedColorWithSameArgbValue() + { + Color baseColor = new Color(1f, 0f, 0f, 1f); + Color derivedColor = new DerivedColor(1f, 0f, 0f, 1f); + + Assert.Equal(baseColor.ToInt(), derivedColor.ToInt()); + Assert.True(baseColor.Equals(derivedColor)); + Assert.True(derivedColor.Equals(baseColor)); + Assert.True(EqualityComparer.Default.Equals(baseColor, derivedColor)); + Assert.Equal(baseColor.GetHashCode(), derivedColor.GetHashCode()); + } + [Fact] public void TestHashCodeNamedColors() {