在 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
(编译器知道这一点,因为您已经显式定义了 C1
和 C2
从 object
以外的任何类型继承),但在许多情况下,实现 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。
我惊讶地发现我可以做到这一点:
// 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
(编译器知道这一点,因为您已经显式定义了 C1
和 C2
从 object
以外的任何类型继承),但在许多情况下,实现 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。