在 C# 中,我处于环境提供的以下类型的场景中:
public interface IFoo {
}
public abstract class Base {
}
public class Derived : Base, IFoo {
}
public class Arbitrary {
public Base GetBase() { }
}
这是我写的除此之外的内容。请注意,我可以保证在我的代码中Arbitrary.GetBase()
始终返回.Derived
public class Arbitrary2 : Arbitrary {
public IFoo GetDerived() {
return (IFoo)base.GetBase();
}
}
但是,此代码失败并显示消息“无法将类型 'Base' 转换为 'IFoo'”。
但是,如果我这样做,那么它会起作用:
public class Arbitrary2 : Arbitrary {
public IFoo GetDerived() {
Object baseAsObject = base.GetBase();
return (IFoo)baseAsObject ;
}
}
为什么在我将它向下转换为 IFoo 之前必须向上转换为 Object?这两段代码在功能上是相同的,如果强制转换无效,后者会在运行时可靠地崩溃。我不明白为什么编译器会抱怨。