Это проблема C#. Вы не можете привести объект, созданный как экземпляр базового класса, к производному классу. Это не так, как полиморфизм разработан. Если вы создаете объект как Foo.Character, он никогда не может быть приведен к Bar.Character, который наследует его, ЕСЛИ изначально этот объект не был создан как Bar.Character, затем приведен к базовому объекту, а затем снова обратно.
Идея базового класса, который, по-видимому, является вашим вариантом использования класса Foo.Character, заключается в том, чтобы быть общим классом, из которого несколько производных, а не классом, который вы создаете (например, абстрактный класс) , Я бы сказал, что при таком сценарии нельзя создать символ Foo.Character. И поэтому все экземпляры должны быть Bar.Character или любым другим производным экземпляром базового символа.
Простое изменение этой строки
Bar.Character character = (Bar.Character)fooEngine.list[0];
на
Foo.Character character = (Foo.Character)fooEngine.list[0];
Будет скомпилировано и выполнено в соответствии с вашим примером. Он приведёт все к своему базовому классу, но вы по-прежнему будете иметь данные из оригинального Bar.Character до приведения (это будет работать только в вашем примере, но не в предложенном мной коде ниже).
Вот мои предлагаемые изменения:
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Foo.FooEngine fooEngine = new Foo.FooEngine();
//TODO: NO LONGER POSSIBLE fooEngine.list.Add(new Foo.Character(0));
fooEngine.list.Add(new Bar.Character(0, "Test1"));
fooEngine.list.Add(new Example.Character(0, "Test2"));
Bar.Character character = (Bar.Character)fooEngine.list[0];
Example.Character character2 = (Example.Character)fooEngine.list[1];
}
}
}
namespace Foo
{
using System.Collections.Generic;
public abstract class Character
{
public int ID;
}
public class FooEngine
{
public List<Foo.Character> list = new List<Foo.Character>();
}
}
namespace Bar
{
public class Character : Foo.Character
{
public string name;
public Character(int ID, string name)
{
base.ID = ID;
this.name = name;
}
}
}
namespace Example
{
public class Character : Foo.Character
{
public string name;
public Character(int ID, string name)
{
base.ID = ID;
this.name = name;
}
}
}