diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Node/JsonNull.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Node/JsonNull.cs index 472051a4a5ef6..bb48216e936bb 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Node/JsonNull.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Node/JsonNull.cs @@ -42,24 +42,44 @@ public JsonNull() { } /// Compares other JSON null to the value of this instance. /// /// The JSON null to compare against. - /// - public bool Equals(JsonNull other) => true; + /// + /// if is not null, + /// otherwise. + /// + public bool Equals(JsonNull other) => !(other is null); /// /// Compares values of two JSON nulls. /// /// The JSON null to compare. /// The JSON null to compare. - /// - public static bool operator ==(JsonNull left, JsonNull right) => true; + /// + /// if both instances match, + /// otherwise. + /// + public static bool operator ==(JsonNull left, JsonNull right) + { + // Test "right" first to allow branch elimination when inlined for null checks (== null) + // so it can become a simple test + if (right is null) + { + // return true/false not the test result https://github.com/dotnet/coreclr/issues/914 + return (left is null) ? true : false; + } + + return right.Equals(left); + } /// /// Compares values of two JSON nulls. /// /// The JSON null to compare. /// The JSON null to compare. - /// - public static bool operator !=(JsonNull left, JsonNull right) => false; + /// + /// if both instances do not match, + /// otherwise. + /// + public static bool operator !=(JsonNull left, JsonNull right) => !(left == right); /// /// Creates a new JSON null that is a copy of the current instance. diff --git a/src/libraries/System.Text.Json/tests/JsonNullTests.cs b/src/libraries/System.Text.Json/tests/JsonNullTests.cs index bc0891e261879..17adadaae4f49 100644 --- a/src/libraries/System.Text.Json/tests/JsonNullTests.cs +++ b/src/libraries/System.Text.Json/tests/JsonNullTests.cs @@ -45,17 +45,15 @@ public static void TestEquals() Assert.False(jsonNull1.Equals(new JsonString("null"))); Assert.False(jsonNull1.Equals(new Exception())); - // Null comparisons behave this way because of implicit conversion from null to JsonNull: - - Assert.True(jsonNull1.Equals(null)); - Assert.True(jsonNull1 == null); - Assert.False(jsonNull1 != null); + Assert.False(jsonNull1.Equals(null)); + Assert.False(jsonNull1 == null); + Assert.True(jsonNull1 != null); JsonNull jsonNullNull = null; - Assert.True(jsonNull1.Equals(jsonNullNull)); - Assert.True(jsonNull1 == jsonNullNull); - Assert.False(jsonNull1 != jsonNullNull); + Assert.False(jsonNull1.Equals(jsonNullNull)); + Assert.False(jsonNull1 == jsonNullNull); + Assert.True(jsonNull1 != jsonNullNull); JsonNull otherJsonNullNull = null; Assert.True(jsonNullNull == otherJsonNullNull); @@ -64,7 +62,7 @@ public static void TestEquals() JsonNode jsonNodeNull = null; Assert.False(jsonNull1.Equals(jsonNodeNull)); - + JsonArray jsonArrayNull = null; Assert.False(jsonNull1.Equals(jsonArrayNull)); } @@ -75,10 +73,10 @@ public static void TestGetHashCode() var jsonNull = new JsonNull(); Assert.Equal(jsonNull.GetHashCode(), new JsonNull().GetHashCode()); - + JsonNode jsonNodeNull = new JsonNull(); Assert.Equal(jsonNull.GetHashCode(), jsonNodeNull.GetHashCode()); - + IEquatable jsonNullIEquatable = new JsonNull(); Assert.Equal(jsonNull.GetHashCode(), jsonNullIEquatable.GetHashCode());