C# - 为什么我需要在向下转换之前向上转换为Object?

Dai*_*Dai 3 c# inheritance casting

在C#中,我处于环境提供的以下类型的场景中:

public interface IFoo {
}

public abstract class Base {
}

public class Derived : Base, IFoo {
}

public class Arbitrary {
    public Base GetBase() { }
}
Run Code Online (Sandbox Code Playgroud)

这是我写的除此之外的内容.请注意,我可以在我的代码,保证Arbitrary.GetBase()始终返回的一个实例Derived.

public class Arbitrary2 : Arbitrary {
    public IFoo GetDerived() {
        return (IFoo)base.GetBase();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,此代码失败,并显示消息"无法将类型'Base'转换为'IFoo'".

但如果我这样做,那么它的工作原理:

public class Arbitrary2 : Arbitrary {
    public IFoo GetDerived() {
        Object baseAsObject = base.GetBase();
        return (IFoo)baseAsObject ;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么在我将它转发给IFoo之前​​需要将此向上转换为对象?这两段代码在功能上是相同的,如果转换无效,后者将在运行时可靠地崩溃.我不明白为什么编译器会抱怨.

Ree*_*sey 6

你不需要这样做.您的代码应该按原样运行.有关详细信息,请参阅此计

using System;

public interface IFoo { }

public abstract class Base { }

public class Derived : Base, IFoo { }

public class Arbitrary {
    public Base GetBase() { return new Derived(); }
}

public class Arbitrary2 : Arbitrary {
    public IFoo GetDerived() {
        return (IFoo)base.GetBase();
    }
}

class Program
{
    static void Main(string[] args)
    {
        Arbitrary2 test = new Arbitrary2();
        IFoo check = test.GetDerived();

        Console.WriteLine(check.GetType().Name);

        Console.WriteLine("Press key to exit:");
        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)