c# – Actualizar objeto en lista genérica .NET

Con este código entenderéis a lo que me refiero, funciona correctamente:

private static readonly List<Product> products = new();

public Task<bool> UpdateAsync(Product product)
{
    var existingProduct = products.FirstOrDefault(p => product != null && p.Id == product.Id);
    if (existingProduct == null)
    {
        return Task.FromResult(false);
    }

    existingProduct.Name = product.Name;

    existingProduct.IsInStock = product.IsInStock;
    existingProduct.Price = product.Price;
    existingProduct.Category = product.Category;
    existingProduct.ImageFileName = product.ImageFileName;
    return Task.FromResult(true);
}

Cuando cambiamos las propiedades del objeto que nos devolvió FirstOrDefault() no se hace necesario remover el objeto.
Por qué puedo cambiar las propiedades de un objeto contenido dentro de una lista genérica sin necesidad de removerlo anteriormente y añadirlo posteriormente? (.NET)