在 C# 中,不是将一个接口显式转换为另一个接口,检查类型吗?

In C# isn't explicit casting of an interface to another, type checked?

我惊讶地发现我可以做到这一点:

// code snipped from C# interactive
public interface I1 { }
public interface I2 { }
I1 i1;
I2 i2 = (I2)i1 // explicit cast to an arbitrary type, works!

为什么允许这样做?

我认为上述场景中接口的行为与 类 相同,例如:

// code snipped from C# interactive
public class C1 { }
public class C2 { }
C1 c1;
C2 c2 = (C2)c1; //error CS0030: Cannot convert type 'C1' to 'C2'

原因很简单:没有任何情况可以将 C1 强制转换为 C2(编译器知道这一点,因为您已经显式定义了 C1C2object 以外的任何类型继承),但在许多情况下,实现 I1 的东西也可能实现 I2.

例如:

    public interface I1 { }
    public interface I2 { }

    public class C1: I2, I1 { }


    public void Method()
    {
        I1 implementor = new C1();
        I2 implementor2 = (I2)implementor;//totally safe at both compile time and run time
    }

此处 C1 实现了 I1 以及 I2,因此转换为 I2 是有效的。编译器只知道 implementor 是实现 I1 的某个 class。会不会有一些 class 实现了 I1 也实现了 I2?当然,我们可以以C1为例。如果具体的 class 没有实现 I2.

,编译器将让它滑动并且在运行时会发生错误

话虽这么说,我绝对不建议将某些接口转换为另一个接口 willy-nilly。