diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs
index 9565c361..72e8d959 100644
--- a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs
+++ b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs
@@ -213,7 +213,7 @@ public string Add(QueryString other)
/// True if both PathString values are equal
public bool Equals(PathString other)
{
- return string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase);
+ return Equals(other, StringComparison.OrdinalIgnoreCase);
}
///
@@ -224,6 +224,10 @@ public bool Equals(PathString other)
/// True if both PathString values are equal
public bool Equals(PathString other, StringComparison comparisonType)
{
+ if (!HasValue && !other.HasValue)
+ {
+ return true;
+ }
return string.Equals(_value, other._value, comparisonType);
}
@@ -236,9 +240,9 @@ public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
- return false;
+ return !HasValue;
}
- return obj is PathString && Equals((PathString)obj, StringComparison.OrdinalIgnoreCase);
+ return obj is PathString && Equals((PathString)obj);
}
///
@@ -247,7 +251,7 @@ public override bool Equals(object obj)
/// The hash code
public override int GetHashCode()
{
- return (_value != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0);
+ return (HasValue ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0);
}
///
@@ -258,7 +262,7 @@ public override int GetHashCode()
/// True if both PathString values are equal
public static bool operator ==(PathString left, PathString right)
{
- return left.Equals(right, StringComparison.OrdinalIgnoreCase);
+ return left.Equals(right);
}
///
@@ -269,7 +273,7 @@ public override int GetHashCode()
/// True if both PathString values are not equal
public static bool operator !=(PathString left, PathString right)
{
- return !left.Equals(right, StringComparison.OrdinalIgnoreCase);
+ return !left.Equals(right);
}
///
diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs
index e1be9d98..6aa15216 100644
--- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs
+++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs
@@ -16,6 +16,44 @@ public void CtorThrows_IfPathDoesNotHaveLeadingSlash()
ExceptionAssert.ThrowsArgument(() => new PathString("hello"), "value", "The path in 'value' must start with '/'.");
}
+ [Fact]
+ public void Equals_EmptyPathStringAndDefaultPathString()
+ {
+ // Act and Assert
+ Assert.Equal(PathString.Empty, default(PathString));
+ Assert.Equal(default(PathString), PathString.Empty);
+ Assert.True(PathString.Empty == default(PathString));
+ Assert.True(default(PathString) == PathString.Empty);
+ Assert.True(PathString.Empty.Equals(default(PathString)));
+ Assert.True(default(PathString).Equals(PathString.Empty));
+ }
+
+ [Fact]
+ public void NotEquals_DefaultPathStringAndNonNullPathString()
+ {
+ // Arrange
+ var pathString = new PathString("/hello");
+
+ // Act and Assert
+ Assert.NotEqual(pathString, default(PathString));
+ }
+
+ [Fact]
+ public void NotEquals_EmptyPathStringAndNonNullPathString()
+ {
+ // Arrange
+ var pathString = new PathString("/hello");
+
+ // Act and Assert
+ Assert.NotEqual(pathString, PathString.Empty);
+ }
+
+ [Fact]
+ public void HashCode_CheckNullAndEmptyHaveSameHashcodes()
+ {
+ Assert.Equal(PathString.Empty.GetHashCode(), default(PathString).GetHashCode());
+ }
+
[Theory]
[InlineData(null, null)]
[InlineData("", null)]