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());