Как клонировать унаследованный объект?

у меня естьTile класс с этим методом:

    public object Clone()
    {
        return MemberwiseClone();
    }

И еще один классChecker что наследует отTile.

у меня тоже естьBoard класс, который являетсяList<Tile>, Я хочу клонировать доску, поэтому я написал это:

    public Board Clone()
    {
        var b = new Board(width, height);
        foreach (var t in this) b.Add(t.Clone());
        return b;
    }

Но это выдает ошибку:

невозможно преобразовать из объекта в Checkers.Tile

Теперь я могу сделатьTile.Clone метод вернутьTile вместо этого, но тогда будетMemberwiseClone скопировать дополнительные свойства вChecker также?

Если это не проблема, в чем семантическая разница междуBoard.Clone метод а это?

    public Board Clone()
    {
        using (var ms = new MemoryStream())
        {
            var bf = new BinaryFormatter();
            bf.Serialize(ms, this);
            ms.Position = 0;
            return (Board)bf.Deserialize(ms);
        }
    }

Потому что они определенно влияют на мою программу, даже когда я печатаю на нейвыглядит тот же самый. Я не думаю, что что-то происходитклонированный но ссылка возвращается.Board Ctor выглядит так:

    public Board(int width = 8, int height = 8)
    {
        this.width = width;
        this.height = height;
        this.rowWidth = width / 2;
        this.Capacity = rowWidth * height;
    }

Tile класс на самом деле не имеет никаких свойств. У проверки есть только два свойства перечисления:

public enum Color { Black, White };
public enum Class { Man, King };

public class Checker : Tile
{
    public Color Color { get; set; }
    public Class Class { get; set; }

Ответы на вопрос(3)

Ваш ответ на вопрос