I am working with a BaseController that is used for a variety of entities. They may have int or string primary keys, represented by <TPk>. 
E.g.:
[HttpGet]
public ActionResult Create(TPk id)
{
    return View();
}
Everything is fine until I try and use TPk as an optional parameter. 
[HttpGet]
public ActionResult Create(TPk id = default(TPk))
{
    return View();
}
It seems that the 'optional' part isn't working.
So /controller/create/2 is fine, but  /controller/create gives me the following error: 
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Create(Int32)'
The optional works fine with an int or string id.  I can call /controller/create/2 AND /controller/create. 
But using a generic type argument TPk, the parameterless route no longer works. 
What I've Tried
I have tried making the TPk parameter nullable, but it won't compile:  
The type 'TPk' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'Nullable'
I have tried changing the parameter name from id to altId as per this question - no joy
I have tried calling the same method, in exactly the same way, but with non-generic parameters. E.g.:
public virtual async Task<ActionResult> Create(int id = default(int))
This worked fine.
I have tried creating a simple new project to isolate this code. (Shown below). This still gives problems with the parameterless version.
Simple Code Test
Controller
public abstract class BaseController<TPk> : Controller
{
    public ActionResult Create(TPk id = default(TPk))
    {
        return View();
    }
}
public class NewsController : BaseController<int>
{
}
Entity Classes
public class BaseDataModel<TPk>
{
    public TPk Id { get; set; }
    public string Title { get; set; }
}
public class PageDataModel : BaseDataModel<string>
{
    public string Content { get; set; }
}
public class NewsDataModel : BaseDataModel<int>
{
    public DateTime Date { get; set; }
}