Общий тип возврата и порядок аргументов в c # - PullRequest
0 голосов
/ 18 января 2019

Я хочу создать универсальный метод, как показано ниже:

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;

оба одинаковы?

1 Ответ

0 голосов
/ 18 января 2019

Обновление

Нет необходимости в порядке объявления общих параметров, однако запишите их так, как они кажутся логичными, ваши первые примеры (мне кажется более логичными).

Оригинал

Я шел по этой дорожке в саду и совершенно неправильно понял вопрос

Ваш код вызова не может переключать общие параметры, потому что у вас есть ограничения на метод. в этом случае единственный вариант, который у вас есть, это сделать разные перегрузки одним и тем же методом.

То есть первый универсальный параметр, ожидающий тип 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)  { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...