Recientemente me sorprendió descubrir que aparentemente el compilador no es estricto al comparar referencias de interfaz y me pregunto por qué funciona de esta manera.¿Por qué se pueden comparar referencias de interfaz C# sin relación sin error del compilador?
consideran este código:
class Program
{
interface I1 {}
interface I2 {}
class C1 : I1 {}
class C2 : I2 {}
static void Main(string[] args)
{
C1 c1 = new C1();
C2 c2 = new C2();
I1 i1 = c1;
I2 i2 = c2;
bool x = c1 == c2;
bool y = i1 == i2;
}
}
El compilador dice que no puedo comparar c1 == c2
, que sigue. Los tipos no tienen ninguna relación. Sin embargo, me permite comparar i1 == i2
. Esperaría que fallara aquí con una falla en tiempo de compilación, pero me sorprendió descubrir que puede comparar cualquier interfaz con cualquier otra y el compilador nunca se quejará. Podría comparar, por ejemplo (I1)null == (IDisposable)null
y no hay problema.
¿Las interfaces no son objetos? ¿Son un tipo especial de referencia? Mi expectativa sería que un ==
daría como resultado una comparación de referencia directa o una llamada a los equivalentes virtuales de la clase concreta.
¿Qué me estoy perdiendo?
Para información, '==' se asocia típicamente con el operador op_Equality, no con el equivalente virtual (más comparación de referencia, pero ya lo cubrió) –