Обновление
Нет необходимости в порядке объявления общих параметров, однако запишите их так, как они кажутся логичными, ваши первые примеры (мне кажется более логичными).
Оригинал
Я шел по этой дорожке в саду и совершенно неправильно понял вопрос
Ваш код вызова не может переключать общие параметры, потому что у вас есть ограничения на метод. в этом случае единственный вариант, который у вас есть, это сделать разные перегрузки одним и тем же методом.
То есть первый универсальный параметр, ожидающий тип RequestModel
, как вы указали в своих ограничениях, вы не можете отправить ему ResponseModel. * 1018 например *
PerformSomeAction<SomeResponse,SomeRequest>()
Вы можете (однако) перегружать подписи и общие параметры, хотя
Exmaple
public class SwitchAroo
{
Task<Response> PerformSomeAction<Request, Response>(
Request request, string token)
where Response : ResponseModel
where Request : RequestModel { ... }
Task<Response> PerformSomeAction<Response, Request>(
Request request, string token)
where Response : ResponseModel
where Request : RequestModel { ... }
}
Также просто для удовольствия. Компилятор позволит вам перегрузить вот так (в общем), так как подпись принципиально отличается
static Task<U> PerformSomeAction<T, U>(
T request, string token) { ... }
static Task<U> PerformSomeAction<U, T>(
T request, string token) { ... }
Но не это, поскольку подпись, по сути, одинакова (если бы вы могли, это вызвало бы все виды странных проблем с разрешением перегрузки)
static Task<U> PerformSomeAction<T, U>(
T request, string token) { ... }
static Task<U1> PerformSomeAction<T1, U1>(
T1 request, string token) { ... }