On Sun, 16 Jan 2011 08:11:45 -0500, Stewart Gordon <[email protected]> wrote:

On 16/01/2011 08:23, "Jérôme M. Berger" wrote:
Stewart Gordon wrote:
On 15/01/2011 17:44, Steven Schveighoffer wrote:
<snip>
Which unnecessarily complicates things. For example, you can't compare
two interfaces (try it!).

?
interface I {}

...

I a = ...;
I b = ...;

if (a == b) //<-- ERROR


1.065: compiles without error, though it seems to be equivalent to is
2.051: it's really weird
----------
C:\Users\Stewart\Documents\Programming\D\Tests>dmd interface_equals.d
interface_equals.d(7): Error: function object.opEquals (Object lhs, Object rhs)
is not callable using argument types (I,I)
interface_equals.d(7): Error: cannot implicitly convert expression (a) of type i
nterface_equals.I to object.Object
interface_equals.d(7): Error: cannot implicitly convert expression (b) of type i
nterface_equals.I to object.Object
----------

Of course, if the interface declares an opEquals, it's a whole different story....

Nope.  try it:

interface I { bool opEquals(I other); }

I a;
I b;

a == b; // same error.

The problem is that when TDPL was implemented, (Object)a == (Object)b was redefined from a.opEquals(b) to object.opEquals(a, b), where object is the module object.

That function's signature looks like this:

bool opEquals(Object lhs, Object rhs);

For some reason the compiler tries to do the same thing with interfaces, but of course, there is no opEquals for your specific interface in object. Even if there was, you'd likely get an overload error.

This would be easily resolved if interfaces were known to be Objects.

-Steve

Reply via email to