我想创建一个如下所示的通用方法:
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;
都一样吗?
答案 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) { ... }