C# c中的泛型类型返回和参数顺序#
我想创建一个通用方法,如下所示:C# c中的泛型类型返回和参数顺序#,c#,.net,generic-programming,generic-method,C#,.net,Generic Programming,Generic Method,我想创建一个通用方法,如下所示: Task<Response> PerformSomeAction<Request, Response>( Request request, string token) where Response : ResponseModel where Request : RequestModel; 任务执行部分操作( 请求(字符串令牌) 何处响应:R
Task<Response> PerformSomeAction<Request, Response>(
Request request, string token)
where Response : ResponseModel
where Request : RequestModel;
任务执行部分操作(
请求(字符串令牌)
何处响应:ResponseModel
where-Request:RequestModel;
我们在申报时是否需要维护订单
我们也可以这样写吗
Task<Response> PerformSomeAction<Response, Request>(
Request request, string token)
where Response : ResponseModel
where Request : RequestModel;
任务执行部分操作(
请求(字符串令牌)
何处响应:ResponseModel
where-Request:RequestModel;
两者是否相同?更新
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 { ... }
}
在声明泛型参数时不需要顺序,但是按照它们看起来合乎逻辑的方式编写它们,您的第一个示例(对我来说似乎更合乎逻辑)
原创
我正沿着这条花园小路走,完全误解了这个问题
调用代码无法切换泛型参数,因为您对该方法有约束。在这种情况下,唯一的选择是对同一方法进行不同的重载
也就是说,第一个通用参数需要一种类型的RequestModel
,正如您在约束中所指出的,您不能向它发送一个ResponseModel。例如
PerformSomeAction<SomeResponse,SomeRequest>()
PerformSomeAction()
但是,您可以重载签名和泛型参数
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 { ... }
}
public-class-SwitchAroo
{
任务执行某些操作(
请求(字符串令牌)
何处响应:ResponseModel
where Request:RequestModel{…}
任务执行某些操作(
请求(字符串令牌)
何处响应:ResponseModel
where Request:RequestModel{…}
}
也只是为了好玩。编译器会让你像这样重载(一般来说),因为签名是根本不同的
static Task<U> PerformSomeAction<T, U>(
T request, string token) { ... }
static Task<U> PerformSomeAction<U, T>(
T request, string token) { ... }
静态任务执行某些操作(
T请求,字符串标记){…}
静态任务执行某些操作(
T请求,字符串标记){…}
但不是这样,因为签名本质上是相同的(如果可以的话,它会引发各种奇怪的重载解决问题)
静态任务执行某些操作(
T请求,字符串标记){…}
静态任务执行某些操作(
T1请求,字符串令牌){…}
您试过了吗?感知到的好处是什么?@HoomanBahreini看起来不像你建议的复制品是相关的。。。很明显,OP知道这两个变体都可以(甚至可以在同一个类中共存)-我相信他们要求提供编码风格建议…我不知道为什么您要故意让代码混淆?对我来说,自然的顺序是:请求,响应。我会在where
之后保持相同的顺序,以保持代码干净。现在干净多了-谢谢。(我仍然不认为OP实际上是在根据这个问题寻找这类信息)。