¿Cómo clonar un objeto heredado?

tengo unTile clase con este método:

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

Y otra claseChecker que hereda deTile.

También tengo unaBoard clase que es unaList<Tile>. Quiero clonar el tablero, así que escribí esto:

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

Pero arroja un error:

no se puede convertir de 'objeto' a 'Checkers.Tile'

Ahora puedo hacer elTile.Clone método devolver unTile en cambio, pero luegoMemberwiseClone copie las propiedades adicionales en el sub-Checker ¿también?

Si ese no es el problema, ¿cuál es la diferencia semántica entre lo anterior?Board.Clone método y esto?

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

Porque definitivamente están teniendo diferentes efectos en mi programa, aunque cuando imprimo la pizarrase ve lo mismo. No creo que algo seaclonado pero se devuelve una referencia. losBoard ctor se ve así:

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

losTile La clase en realidad no tiene ninguna propiedad. El verificador solo tiene dos propiedades de enumeración:

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

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta