phobos icon indicating copy to clipboard operation
phobos copied to clipboard

Inconsistent equality of nested nullables

Open vpanteleev-sym opened this issue 8 months ago • 1 comments

import std.typecons : Nullable;

unittest
{
	// Nullable equality is defined such that a value
	// is equal to said value made nullable:

	void assertNullableXIsEqualToX(T)(T x)
	{
		Nullable!T n = x;
		assert(n == x, "n != x");
		assert(x == n, "x != n");
	}

	// We see that this holds for most types:

	assertNullableXIsEqualToX(1);          // OK
	assertNullableXIsEqualToX("foo");      // OK
	assertNullableXIsEqualToX(new Object); // OK

	// However, if the value itself is a nullable,
	// then the equality fails - but, only in the
	// value == value.nullable direction:

	Nullable!int ni;
	assertNullableXIsEqualToX(ni);  // Fail: x != n
}

vpanteleev-sym avatar Apr 01 '25 08:04 vpanteleev-sym

Note that this only happens when the inner Nullable is empty. For example, the following test passes:

Nullable!int ni = 123;
assertNullableXIsEqualToX(ni);  // OK

pbackus avatar Apr 01 '25 17:04 pbackus