Если вы думаете о том, что вы пытаетесь сделать, и о маршрутах, которые вы пробуете, вы поймете, что второй параметр "p" в вашем случае также должен быть отмечен как необязательный параметр.
то есть ваш маршрут должен быть определен так:
routes.MapHttpRoute(
name: "Default",
routeTemplate: "{controller}/{id}/{p}",
defaults: new { id = RouteParameter.Optional, p = RouteParameter.Optional });
Как только вы это сделаете, URL
/ контроллер? Р = 100
сопоставится с вашим
public IQueryable<A> Get(int p) {}
метод и URL-адрес примерно так:
/controller/1?p=100
отобразится на ваш
public A Get(int id, int p) {}
метод, как вы ожидаете.
Так что, чтобы ответить на ваши вопросы .... нет, это не ошибка, а как задумано / ожидается.