Assert.AreEqual falla mientras que no debería

Tengo un comportamiento realmente extraño que no puedo explicar.

Tengo la siguiente clase:

public class Project
{
    public virtual int Id { get; set; }

    public virtual string Name { get; set; }
}

Y un método que devuelve unProject objeto:

public Project GetByName(string Name)
{
    using (ISession session = NHibernateHelper.OpenSession())
    {
        Project project = session.CreateCriteria(typeof(Project))
                                 .Add(Restrictions.Eq("Name", Name))
                                 .UniqueResult<Project>();

        return project;
    }
}

He añadido una prueba de unidad para probar elGetByName método:

[TestMethod]
public void TestGetByName()
{
    IProjectsRepository projectRepository = new ProjectsRepository();

    var expected = new Project { Id = 1000, Name = "Project1" };
    var actual = projectRepository.GetByName(expected.Name);

    Assert.AreEqual<Project>(expected, actual);
}

Pero cuando ejecuto la prueba de la unidad, falla al comparar el tipo de los dos objetos con el siguiente error:

Assert.AreEqual ha fallado. Se esperaba: <MyProject.NHibernate.Project>. Real: <MyProject.NHibernate.Project>.

¿Por qué está fallando la afirmación?

No esAfirmar.AreEqual ¿Afirmando solo en las propiedades de los objetos?

Según la documentación:

Método Assert.AreEqual (Objeto, Objeto)

Verifica que dos objetos especificados son iguales. La aserción falla si los objetos no son iguales.

Método Assert.AreSame

Verifica que las variables de objeto especificadas se refieren al mismo objeto.

Respuestas a la pregunta(4)

Su respuesta a la pregunta