C#中的通用类型返回和参数顺序

时间:2019-01-18 06:11:45

标签: c# .net generic-programming generic-method

我想创建一个如下所示的通用方法:

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 :(得分:1)

更新

声明通用参数不需要任何顺序,但是可以按照看起来合理的方式编写它们,这是您的第一个示例(对我而言似乎更合逻辑)。

原始

我正朝着这个花园的小路走去,完全误解了这个问题

您的调用代码无法切换通用参数,因为您对该方法有约束。在这种情况下,您唯一的选择是对同一方法进行不同的重载。

也就是说,第一个通用参数期望您在约束中表示的RequestModel类型,因此无法将其发送给ResponseModel。例如

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)  { ... }